La commande sed |
![]() |
![]() |
Expressions régulières et sed |
sed est é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.
sed est une évolution de l'éditeur ed lui même précurseur de vi, la syntaxe n'est franchement pas très conviviale, mais il permet de réaliser des commandes complexes sur des 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.
La fonction de substitution permet de changer la première ou toutes les occurences d'une chaîne par une autre. La syntaxe est la suivante:
commande | signification |
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 régulière.
Commande | Signification |
sed -e "s/[Ff]raise/FRAISE/g" fichier | substituer toutes les chaînes Fraise ou fraise par FRAISE |
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 régulières:
sed "/toto/d" fichier
Cette commande supprime les lignes contenant la chaîne toto. Si au contraire on ne veut pas effacer les lignes contenant la chaîne toto (toutes les autres sont 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.
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.
La fonction q (quit) va interrompre l'exécution de sed, 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.
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".
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.