La commande sed
Description
Le mot sed signifie "éditeur de flux" (Stream EDitor).
L'éditeur de flux Sed lit les lignes d'un ou plusieurs fichiers depuis l'entrée standard, exécute des commandes lues elles aussi depuis l'entrée standard sous forme d'expressions (commandes d'édition) ou depuis un fichier texte (script), et retourne le résultat du traitement soit sur la sortie standard (écran) soit en modifiant le fichier original.
sed est la plupart du temps utilisé pour ses fonctionnalités de substitutions de chaînes de caractères. On peut grâce à sed rechercher du texte dans un fichier et modifier ce dernier. La puissance de sed vient également du fait qu'on peut utiliser les expressions régulières.
Guide
Voici le synopsis de la commande obtenu à partir de la commande man sed
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
On pourrait résumer le mécanisme de fonctionnement de sed de cette façon :
- lecture d'une ligne sur le flux d'entrée (une ligne étant délimitée par un caractère de saut de ligne);
- traitement de la ligne en fonction des diverses commandes lues:
- On peut écrire les commandes directement dans la ligne de commande, avec l'option sed -e. On séparera les commandes par des point-virgules;
sed -e 'fonction sed' [fichier.txt]
- On peut passer à sed un script (fichier externe) contenant les commandes pour le traitement (myScriptFile), avec l'option sed -f myScriptFile.
sed -f fichier_script [fichier.txt]
- redirection du résultat, différentes options s'offrent:
- On peut afficher le résultat sur la sortie standard (écran) ou le rediriger vers un nouveau fichier avec le symbole > (On garde intact le fichier en entrée).
sed -e 'fonction sed' [fichier.txt] > fichierTraite.txt
- On peut afficher directement le résultat dans le fichier passé en entrée, on modifie alors le fichier en entrée avec l'option sed -i;
sed -i 'fonction sed' [fichier.txt]
- passage à la ligne suivante.
Exemples
suppression
sed -e '4d; 7d' test.txt
efface les lignes 4 et 7 (option d pour delete) du texte du fichier test.txt et affiche le résultat à l'écran.
On peut aussi utiliser des expressions régulières (regex) pour appliquer la commande sur toutes les lignes où le motif est trouvé. On décrit un motif comme ceci : /motif/
sed '/^#/ d' test.txt
supprime toutes les lignes commençant par une dièse (^ signifie début de ligne) pour l'affichage.
On peut définir une plage de texte comprise entre le motif 1 et le motif 2 avec : /motif1/,/motif2/
sed '/^Bonjour/,/^Au revoir/d' test.txt
supprime toutes les lignes comprises entre 'Bonjour' et 'Au revoir' du texte du fichier test.txt et affiche le résultat à l'écran.
Chercher et remplacer
La commande sed permet de rechercher et remplacer du texte à partir d'expressions régulières ou de chaîne de caractères.
Syntaxe : s/motifRecherché/substitut/
La substitution va se faire sur la première occurrence du motif.
Pour que le remplacement se fasse sur tout le texte, il faut ajouter l'option g comme ceci : s/motif/substitut/g
sed -e 's/Paris/Montreal/g' fichier.txt
remplace toutes les occurrences de Paris par Montreal dans le texte passé en entrée et affiche le résultat à l'écran.
Le motif recherché peut être une regex mais le substitut doit rester une chaîne de caractères.
NB : le substitut accepte quand même le métacaractère &, ainsi que les références arrières telles que \1 (de 1 à 9).
sed -re 's/^# *//' nomFichier
Le motif
/^# */
correspond aux lignes commentées (aux lignes commençant par #) suivies d'un ou plusieurs espaces (* est un métacaractère signifiant 0 ou plus). Le substitut est vide. Cette commande va donc décommenter et supprimer les espaces au début des lignes commentées du contenu de nomFichier et afficher le résultat à l'écran.
sed -re 's/\t/ /g' nomfichier
remplace les tabulations par un espace.
Échange de caractères
syntaxe : y/listeCaractères/listeRemplacants/.
sed -re ''''y'''/éèê/eee/' test.txt
remplace les 'e' accentués par des 'e' sans accents.