sed
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.
Or sed
a bien plus de possibilités que ça, comme nous allons le voir.
Tout d’abord, rappelons les bases : sed
est un programme Unix de base, mais
aussi un langage de manipulation de texte dérivé de ed
, l’éditeur original.
ed
est un éditeur de ligne, conçu a l’époque ou les ordinateurs n’étaient pas
personnels et étaient utilisés avec des téléscripteurs, 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
curseur et affichant plusieurs lignes. sed
est donc une évolution de ed
, le
s signifiant stream, sed
est un éditeur de flux, prenant donc avantage du
concept Unixien de flux de données (voir Flux standards) pour éditer plus d’une ligne a la fois.
En pratique, sed
est principalement utilisé sur des fichiers.
sed
a quelques options pratique, notamment -s
qui permet d’empêcher
l’affichage systématique des lignes traitées, ou bien -i
(pour GNU sed) qui
permet de rediriger l’output dans le fichier d’input. Cela dit, l’intérêt unique
du programme est son langage de manipulation de texte.
ed
, et donc sed
, utilise un langage basé sur les séparations (en général des
/). Ainsi, la commande de base dans sed
est
/[regex]/
qui permet de ne sélectionner que les lignes qui matchent [regex] (et donc de n’exécuter les commandes qui suivent que sur ces lignes.)
La commande sed
la plus utilisée est bien entendu le s, qui s’utilise de
la façon suivante :
s/[old text]/[new text]/[options]
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 g
,
qui permet d’appliquer la commande affectée a toutes les occurrences du texte
matché sur la/les lignes concernée-s.
Les exceptions a la “fixité” de [new text] sont particulièrement
intéressantes. En effet, sed
utilise un langage de regex plutôt standard,
excepté le fait qu’il permet jusqu’à 9 “holding spaces”, qui sont délimités par
\( et \), et qui sont représentées dans le texte de remplacement par \1 à
\9.
Par exemple, la commande
sed 's/\(hello world\) world/\1/'
sur le texte “hello world world” renverrait comme résultat
hello world
De la même façon, le symbole &
dans le texte de remplacement représente le
texte original. Ainsi, la commande
sed 's/hello world/& world/'
sur le texte “hello world” renverrait comme résultat
hello world world
Une autre commande utile est p, qui sert a afficher le texte présent dans l’espace courant :
/[regex]/p
sed
stocke en effet la ligne sur laquelle il travaille dans un espace mémoire
dédié, que j’appelle l’espace courant (pattern space en anglais). La commande
p
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
p affiche donc ce dernier.
Un autre exemple de commande sont c, i et a, qui s’utilisent ainsi :
c \ [text]
De la même façon, pour le i :
i \ [text]
Et de même pour a.
Ces trois commandes s’utilisent de la même façon pour la bonne raison qu’elles sont très proches. i sert a insérer du texte avant le pattern space. a sert a insérer du texte après le pattern space, et enfin c sert a remplacer tout 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.
Enfin, dernière commande ne fonctionnant que ligne par ligne, d : /[regex]/d d (delete) supprime les contenus du pattern space.
sed
est un outil puissant, mais complexe. Dans un prochain article, je
parlerai des commandes multilignes et des labels.