Présentation

sed est un éditeur ligne non interactif : il lit les lignes d’un fichier une à  une (ou provenant de l’entrée standard), leur applique un certain nombre de commandes d’édition et renvoie les lignes résultantes sur la sortie standard. Il ne modifie pas le fichier traité, il écrit tout sur la sortie standard.

Il faut savoir que sed utilise les expressions rationnelles basiques (par oppositions aux expressions rationnelles étendues), il est donc nécessaire de maîtriser leur syntaxe. Pour cela, il est possible de consulter l’article Expressions rationnelles :-).

sed est une évolution de l’éditeur ed, qui a aussi donné vi. La syntaxe n’est franchement pas très conviviale, mais il permet de réaliser des commandes complexes sur de gros fichiers.

La syntaxe de sed est la suivante :

sed -e 'programme sed' fichier-a-traiter

ou

sed -f fichier-programme fichier-a-traiter

Vous disposez de l’option -n qui supprime la sortie standard par défaut. sed va écrire uniquement les lignes concernées par le traitement (sinon il écrit tout, màªme les lignes non traitées). L’option -e n’est pas nécessaire quand vous avez une seule fonction d’édition.

La commande sed est une commande très riche, ne vous sont présentées ici que les fonctions les plus courantes. Pour plus de détails faites un man sed et/ou man ed (bref, RTFM).

Ah oui, une chose avant d’aller plus loin : surtout, je dis bien surtout, il ne faut jamais lire un fichier avec sed, et écrire dans ce màªme fichier par une redirection shell, comme résultat de sed [1]. Vous n’obtiendriez qu’un fichier vide. Très souvent, il faut écrire dans un fichier temporaire, puis écraser le fichier d’origine par le fichier temporaire. Voilà , vous àªtes parés :-)

La fonction de substitution s

La fonction de substitution s permet de changer la première ou toutes les occurences d’une chaîne par une autre. La syntaxe est la suivante :

sed "s/toto/TOTO/" fichier va changer la première occurence de la chaîne "toto" par "TOTO" (la première chaîne toto rencontrée dans le texte uniquement).

sed "s/toto/TOTO/3" fichier va changer la troisième occurence de la chaîne "toto" par "TOTO" (la troisième chaîne toto rencontrée dans le texte uniquement).

sed "s/toto/TOTO/g" fichier va changer toutes les occurences de la chaîne "toto" par "TOTO" (toutes les chaînes toto rencontrées sont changées).

sed "s/toto/TOTO/p" fichier en cas de remplacement la ligne concernée est affichée sur la sortie standard (uniquement en cas de substitution).

sed "s/toto/TOTO/w resultat" fichier en cas de substitution la ligne en entrée est inscrite dans un fichier résultat.

La fonction de substitution peut évidemment àªtre utilisée avec une expression rationnelle.

sed -e "s/[Ff]raise/FRAISE/g" fichier substitue toutes les chaînes "Fraise" ou "fraise" par "FRAISE."

La fonction de suppression d

La fonction de suppression d supprime les lignes comprises dans un intervalle donné. La syntaxe est la suivante :

sed "20,30d" fichier

Cette commande va supprimer les lignes 20 à  30 du fichier fichier. On peut utiliser les expressions rationnelles :

sed "/toto/d" fichier

Cette commande supprime les lignes contenant la chaîne "toto". Si au contraire on ne veut effacer que les lignes contenant la chaîne "toto" (toutes les autres étant supprimées), on tapera :

sed "/toto/!d" fichier

En fait les lignes du fichier d’entrée ne sont pas supprimées, elles le sont au niveau de la sortie standard.

Les fonctions p, l, et =

La commande p (print) affiche la ligne sélectionnée sur la sortie standard. Elle invalide l’option -n.

La commande l (list) affiche la ligne sélectionnée sur la sortie standard avec en plus les caractères de contrà´les en clair avec leur code ASCII (deux chiffres en octal).

La commande = donne le numéro de la ligne sélectionnée sur la sortie standard.

Ces trois commandes sont utiles pour le débogage, quand vous mettez au point vos programmes sed.

sed "/toto/=" fichier

Cette commande va afficher le numéro de la ligne contenant la chaîne "toto".

Les fonctions q, r et w

La fonction q (quit) va interrompre l’exécution de sed, et la ligne en cours de traitement est affichée sur la sortie standard (uniquement si -n n’a pas été utilisée).

La fonction r (read) lit le contenu d’un fichier et écrit le contenu sur la sortie standard.

La fonction w (write) écrit la ligne sélectionnée dans un fichier.

sed "/^toto/w resultat" fichier

Cette commande va écrire dans le fichier resultat toutes les lignes du fichier fichier commenà§ant par la chaîne "toto".

Les fonctions a et i

La fonction a (append) va placer un texte après la ligne sélectionnée. La syntaxe est la suivante :

a \
le texte

La fonction i (insert) va placer un texte avant la ligne sélectionnée. La syntaxe est la suivante :


i \
le texte

Si votre texte tient sur plusieurs lignes la syntaxe pour le texte est la suivante :

ligne 1 du texte\  
ligne 2 du texte\      
ligne n du texte\      
dernière ligne
Concrètement vous pouvez appeler la fonction i ou a dans un fichier de commande de sed. Par exemple, soit votre fichier prog.sed suivant :


1i \
début du traitement
s/[tT]oto/TOTO/g
$a \
fin du traitement\    
de notre fichier
On exécute la commande en tapant :

sed -f prog.sed fichier-a-traiter

prog.sed a pour effet d’inscrire avant la première ligne (1i) le texte "début de traitement", et après la dernière ligne ($a) le texte "fin du traitement (retour à  la ligne) de notre fichier".

sed et les sous-chaînes

La commande :

sed -e "s/\([0-9][0-9]*\)/aa\1aa/" fichier

La sous-expression (sous-chaîne) \([0-9][0-9]*\) désigne un ou plusieurs chiffres, chacun sera entouré des caractères aa. La chaîne to2to deviendra toaa2aato.