2014-11-24 22:52:53 +01:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< title > Sed Basics< / title >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< meta name = "author" content = "wxcafé" >
< link rel = "icon" type = "image/png" href = "//wxcafe.net/theme/img/favicon.ico" >
<!-- Le styles -->
2015-09-03 19:58:32 +02:00
< link rel = "stylesheet" href = "//wxcafe.net/theme/css/extra.css" type = "text/css" / >
2014-11-24 22:52:53 +01:00
< link rel = "stylesheet" href = "//wxcafe.net/theme/css/bootstrap.css" type = "text/css" / >
2015-09-03 19:58:32 +02:00
< link href = 'http://fonts.googleapis.com/css?family=Oswald&subset=latin,latin-ext' rel = 'stylesheet' type = 'text/css' >
2014-11-24 22:52:53 +01:00
< script type = "text/javascript" >
/* < ![CDATA[ */
(function() {
var s = document.createElement('script');
var t = document.getElementsByTagName('script')[0];
s.type = 'text/javascript';
s.async = true;
s.src = '//api.flattr.com/js/0.6/load.js?'+
'mode=auto&uid=wxcafe&button=compact&popout=0';
t.parentNode.insertBefore(s, t);
})();
/* ]]> */
< / script > <!-- flattr button loader -->
< style type = "text/css" >
body {
padding-top: 60px;
padding-bottom: 40px;
}
.sidebar-nav {
padding: 9px 0;
}
.tag-1 {
font-size: 13pt;
}
.tag-2 {
font-size: 10pt;
}
.tag-2 {
font-size: 8pt;
}
.tag-4 {
font-size: 6pt;
}
< / style >
< link href = "//wxcafe.net/theme/css/bootstrap-responsive.css" rel = "stylesheet" >
< link href = "//wxcafe.net/theme/css/font-awesome.css" rel = "stylesheet" >
< link href = "//wxcafe.net/theme/css/pygments.css" rel = "stylesheet" >
<!-- Le fav and touch icons -->
< link rel = "shortcut icon" href = "//wxcafe.net/theme/images/favicon.ico" >
< link href = "//wxcafe.net/feeds/feed.rss.xml" type = "application/atom+xml" rel = "alternate" title = "Wxcafé RSS Feed" / >
< / head >
< body >
< div class = "navbar navbar-fixed-top" >
< div class = "navbar-inner" >
< div class = "container-fluid" >
< a class = "btn btn-navbar" data-toggle = "collapse" data-target = ".nav-collapse" >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
2015-09-03 19:58:32 +02:00
< span class = "icon-bar" > < / span >
2014-11-24 22:52:53 +01:00
< / a >
< a class = "brand" href = "//wxcafe.net/index.html" > Wxcafé < / a >
< div class = "nav-collapse" >
< ul class = "nav" >
< li > < a href = "//wxcafe.net/archives.html" > < i class = "icon-th-list" > < / i > Archives< / a > < / li >
< li > < a href = "//wxcafe.net/pages/about/" > A propos< / a > < / li >
< li class = "divider-vertical" > < / li >
< ul class = "nav pull-right" >
< / ul >
< / ul >
< / div > <!-- /.nav - collapse -->
< / div >
< / div >
< / div >
< div class = "container-fluid" >
< div class = "row" >
< div class = "span9" id = "content" >
< section id = "content" >
< article >
< header >
< h1 >
< a href = ""
rel="bookmark"
title="Permalink to Sed Basics">Sed Basics< / a >
< / h1 >
< / header >
< div class = "entry-content" >
< div class = "well" >
< footer class = "post-info" >
< span class = "label" > Date< / span >
< span class = "published" title = "2013-08-18T22:57:00+02:00" >
< i class = "icon-calendar" > < / i > Sun 18 August 2013
< / span >
< br / >
< span class = "label" > By< / span >
< a href = "//wxcafe.net/author/wxcafe.html" > < i class = "icon-user" > < / i > Wxcafe< / a >
< br / >
< span class = "label" > Category< / span >
< a href = "//wxcafe.net/category/tutoriel/" > < i class = "icon-folder-open" > < / i > Tutoriel< / a >
< br / >
< / footer > <!-- /.post - info --> < / div >
< p > < code > sed< / code > est un outil Unix très largement utilisé et très pratique pour manipuler
le texte (ce qui se montre relativement indispensable dans un environnement
Unix, puisque ce système est assez porté sur le texte). Cependant, il assez peu
connu en détail, et la plupart du temps une seule fonction est utilisée : le
remplacement de texte.< br / >
Or < code > sed< / code > a bien plus de possibilités que ça, comme nous allons le voir.< / p >
2015-09-03 19:58:32 +02:00
< p > Tout d’ abord, rappelons les bases : < code > sed< / code > est un programme Unix de base, mais
aussi un langage de manipulation de texte dérivé de < code > ed< / code > , l’ éditeur original.< code > ed< / code > est un éditeur de ligne, conçu a l’ époque ou les ordinateurs n’ étaient pas
personnels et étaient utilisés avec des < a href = "http://fr.wikipedia.org/wiki/telescripteur" > téléscripteurs< / a > , c’ est a dire des
machines dépourvues d’ écrans et ne permettant donc pas l’ utilisation d’ éditeurs
dits “ visuels” , tels que vim, emacs, et globalement tous les éditeurs ayant un
2014-11-24 22:52:53 +01:00
curseur et affichant plusieurs lignes. < code > sed< / code > est donc une évolution de < code > ed< / code > , le
s signifiant stream, < code > sed< / code > est un éditeur de flux, prenant donc avantage du
2015-09-03 19:58:32 +02:00
concept Unixien de flux de données (voir < a href = "http://fr.wikipedia.org/wiki/Flux_standard" > Flux standards< / a > ) pour éditer plus d’ une ligne a la fois.
2014-11-24 22:52:53 +01:00
En pratique, < code > sed< / code > est principalement utilisé sur des fichiers.< / p >
2015-09-03 19:58:32 +02:00
< p > < code > sed< / code > a quelques options pratique, notamment < code > -s< / code > qui permet d’ empêcher
l’ affichage systématique des lignes traitées, ou bien < code > -i< / code > (pour GNU sed) qui
permet de rediriger l’ output dans le fichier d’ input. Cela dit, l’ intérêt unique
2014-11-24 22:52:53 +01:00
du programme est son langage de manipulation de texte.< / p >
< p > < code > ed< / code > , et donc < code > sed< / code > , utilise un langage basé sur les séparations (en général des
/). Ainsi, la commande de base dans < code > sed< / code > est < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > /[regex]/
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de
2015-09-03 19:58:32 +02:00
n’ exécuter les commandes qui suivent que sur ces lignes.) < / p >
2014-11-24 22:52:53 +01:00
< p > < br / >
2015-09-03 19:58:32 +02:00
La commande < code > sed< / code > la plus utilisée est bien entendu le < strong > s< / strong > , qui s’ utilise de
2014-11-24 22:52:53 +01:00
la façon suivante : < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > < span style = "color: #f8f8f2" > s< / span > < span style = "color: #f92672" > /< / span > < span style = "color: #f8f8f2" > [old< / span > < span style = "color: #f8f8f2" > text]< / span > < span style = "color: #f92672" > /< / span > < span style = "color: #f8f8f2" > [new< / span > < span style = "color: #f8f8f2" > text]< / span > < span style = "color: #f92672" > /< / span > < span style = "color: #f8f8f2" > [options]< / span >
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > qui se propose donc de remplacer (substitute) [old text] (qui peut être une
regex) par [new text] (qui doit être un texte fixe, avec quelques
exceptions), en appliquant [options], la plus connue des options étant < code > g< / code > ,
2015-09-03 19:58:32 +02:00
qui permet d’ appliquer la commande affectée a toutes les occurrences du texte
2014-11-24 22:52:53 +01:00
matché sur la/les lignes concernée-s.< br / >
2015-09-03 19:58:32 +02:00
Les exceptions a la “ fixité” de [new text] sont particulièrement
2014-11-24 22:52:53 +01:00
intéressantes. En effet, < code > sed< / code > utilise un langage de regex plutôt standard,
2015-09-03 19:58:32 +02:00
excepté le fait qu’ il permet jusqu’ à 9 “ holding spaces” , qui sont délimités par
2014-11-24 22:52:53 +01:00
\( et \), et qui sont représentées dans le texte de remplacement par \1 à
\9.< / p >
< p > Par exemple, la commande < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > sed ' s/\(hello world\) world/\1/'
2014-11-24 22:52:53 +01:00
< / pre > < / div >
2015-09-03 19:58:32 +02:00
< p > sur le texte “ hello world world” renverrait comme résultat< / p >
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > hello world
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > De la même façon, le symbole < code > & < / code > dans le texte de remplacement représente le
texte original. Ainsi, la commande < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > sed ' s/hello world/& world/'
2014-11-24 22:52:53 +01:00
< / pre > < / div >
2015-09-03 19:58:32 +02:00
< p > sur le texte “ hello world” renverrait comme résultat< / p >
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > hello world world
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > < br / > < / p >
< p > Une autre commande utile est < strong > p< / strong > , qui sert a afficher le texte présent dans
2015-09-03 19:58:32 +02:00
l’ espace courant :< / p >
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > /[regex]/p
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > < code > sed< / code > stocke en effet la ligne sur laquelle il travaille dans un espace mémoire
2015-09-03 19:58:32 +02:00
dédié, que j’ appelle l’ espace courant (pattern space en anglais). La commande< code > p< / code > affiche (print) ce qui ce trouve dans cet espace. La /[regex]/ réduit
le pattern space de façon a ce qu’ il ne contienne que les lignes matchant, et le < strong > p< / strong > affiche donc ce dernier.< / p >
< p > Un autre exemple de commande sont < strong > c< / strong > , < strong > i< / strong > et < strong > a< / strong > , qui s’ utilisent ainsi :< / p >
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > c \
[text]
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > De la même façon, pour le i : < / p >
2015-09-03 19:58:32 +02:00
< div class = "codehilite" style = "background: #272822" > < pre style = "line-height: 125%" > i \
[text]
2014-11-24 22:52:53 +01:00
< / pre > < / div >
< p > Et de même pour a. < / p >
2015-09-03 19:58:32 +02:00
< p > Ces trois commandes s’ utilisent de la même façon pour la bonne raison qu’ elles
2014-11-24 22:52:53 +01:00
sont très proches. < strong > i< / strong > sert a insérer du texte < em > avant< / em > le pattern space. < strong > a< / strong >
sert a insérer du texte < em > après< / em > le pattern space, et enfin < strong > c< / strong > sert a
remplacer < em > tout< / em > le pattern space. Les trois utilisent [text] comme
remplacement ou insert.
Attention, les insertions se font sur la ligne précédant ou suivant le pattern
space, et non sur la ligne en question.< / p >
< p > Enfin, dernière commande ne fonctionnant que ligne par ligne, < strong > d< / strong > :
/[regex]/d
< strong > d< / strong > (delete) supprime les contenus du pattern space.< / p >
< p > < code > sed< / code > est un outil puissant, mais complexe. Dans un prochain article, je
parlerai des commandes multilignes et des labels.< / p >
< / div > <!-- /.entry - content -->
< / article >
< / section >
< / div > <!-- /span -->
< div class = "span3 well sidebar-nav" id = "sidebar" >
< ul class = "nav nav-list" >
<!-- Categories links -->
< li class = "nav-header" > < h4 > < i class = "icon-folder-close icon-large" > < / i > Categories< / h4 > < / li >
< li >
< a href = "//wxcafe.net/category/hacking/" >
< i class = "icon-folder-open icon-large" > < / i > Hacking
< / a >
< / li >
< li >
2015-09-03 19:58:32 +02:00
< a href = "//wxcafe.net/category/note/" >
< i class = "icon-folder-open icon-large" > < / i > Note
2014-11-24 22:52:53 +01:00
< / a >
< / li >
< li >
< a href = "//wxcafe.net/category/oses/" >
< i class = "icon-folder-open icon-large" > < / i > OSes
< / a >
< / li >
< li >
< a href = "//wxcafe.net/category/ranting/" >
< i class = "icon-folder-open icon-large" > < / i > Ranting
< / a >
< / li >
< li >
2015-09-03 19:58:32 +02:00
< a href = "//wxcafe.net/category/tutoriel/" >
< i class = "icon-folder-open icon-large" > < / i > Tutoriel
2014-11-24 22:52:53 +01:00
< / a >
< / li >
< li >
2015-09-03 19:58:32 +02:00
< a href = "//wxcafe.net/category/vidya-games/" >
< i class = "icon-folder-open icon-large" > < / i > Vidya Games
2014-11-24 22:52:53 +01:00
< / a >
< / li >
< hr >
<!-- Social links -->
< li class = "nav-header" > < h4 > < i class = "icon-exchange" > < / i > social< / h4 > < / li >
< a class = "FlattrButton" style = "display:none;"
title="//wxcafe.net"
style="padding-top: 10px;"
rel="flattr;
url://wxcafe.net;
title://wxcafe.net;
button:compact;
popout:0;
uid:wxcafe;
category:blog;"
href="//wxcafe.net">flattr< / a >
< li > < a href = "https://twitter.com/wxcafe" > < i class = "icon-twitter icon-large" > < / i > Twitter< / a > < / li >
< li > < a href = "https://github.com/wxcafe" > < i class = "icon-github icon-large" > < / i > Github< / a > < / li >
< li > < a href = "mailto://wxcafe@wxcafe.net" > < i class = "icon-envelope icon-large" > < / i > Email< / a > < / li >
2015-09-03 19:58:32 +02:00
< li > < a href = "https://pub.wxcafe.net/wxcafe.asc" > < i class = "icon-key icon-large" > < / i > Gpg< / a > < / li >
< li > < a href = "https://www.openstreetmap.org/relation/105146" > < i class = "icon-map-marker icon-large" > < / i > IRL< / a > < / li >
2014-11-24 22:52:53 +01:00
< hr >
<!-- Links -->
< li class = "nav-header" > < h4 > < i class = "icon-external-link" > < / i > Links< / h4 > < / li >
< li > < a href = "https://github.com/wxcafe/blog-source" > < i class = "icon-code icon-large " > < / i > Source!< / a > < / li >
< li > < a href = "http://git.wxcafe.net" > < i class = "icon-github-sign icon-large " > < / i > Public Git< / a > < / li >
< hr >
<!-- - RSS feed -->
< li class = "nav-header" > < h4 > < i class = "icon-rss" > < / i > feeds< / h4 > < / li >
< li > < a href = "//wxcafe.net/feeds/feed.rss.xml" rel = "alternate" > < i class = "icon-bookmark-empty icon-large" > < / i > RSS< / a > < / li >
< li > < a href = "//wxcafe.net/feeds/feed.atom.xml" rel = "alternate" > < i class = "icon-bookmark-empty icon-large" > < / i > Atom< / a > < / li >
< / ul > < / div > <!-- /.well -->
< / div > <!-- /row -->
< hr >
< footer >
< address id = "about" >
Proudly powered by < a href = "http://pelican.notmyidea.org/" > Pelican< / a > ,
which takes great advantage of < a href = "http://python.org" > Python< / a > .< br / >
Powered by < a href = "https://github.com/getpelican/pelican-themes/tree/master/bootstrap2" > bootstrap2< / a > theme, thanks!
< / address >
< / footer >
< / div > <!-- /.fluid - container -->
< / body >
< / html >