Outils pour utilisateurs

Outils du site


enseignement:lea:cours:informatique:linux:sed

Unix pour linguistes : l'éditeur de flot sed(1)

Programmation shell

La commande sed(1) est un éditeur particulier : elle travaille comme un filtre. Votre éditeur de textes favori ouvre une fenêtre ou monopolise tout ou partie de votre terminal mais pas sed(1).

Cette commande sed(1) travaille sur des adresses et sur des expressions régulières et manipule des lignes (terminées par le caractère de fin de ligne, \n sous Unix ; (re-)voir Caractères de contrôle utiles).

Adresses

La commande :

$ sed 5q /tmp/text_file

est parfaitement équivalente à :

$ head -5 /tmp/text_file

Scripts

Un script, dans ce contexte, est une série d'actions d'édition (modifications, suppressions, …). Nous utiliserons sed(1) en ligne de commandes, i. e. sans passer par des fichiers scripts. L'option -e permet d'indiquer à sed(1) le script à exécuter.

Suppressions & Remplacements

La commande :

$ sed -e '/a/d' file

supprime toutes les lignes contenant un a.

La commande :

$ sed -e '5,10d' file

supprime les lignes 5 à 10 (comprise soit 6 lignes en tout).

La commande :

$ sed -e 's/a/b/' file

change sur chaque ligne le 1er a en b. Si on veut changer toutes les occurrences, ajouter le drapeau g :

$ sed -e 's/a/b/g' file

On peut mixer adresses et motifs :

$ sed -e '1,/^a/d' file

aura pour effet de supprimer de la première ligne du fichier à la première ligne commençant par un a.

On peut inverser le sens du groupement de lignes avec ! :

$ sed -e '1,/^a/!d' file

n'affichera plus que de la première ligne à la première ligne commençant par un a (non comprise).

L'adresse $ marque la dernière ligne d'un fichier ; la commande suivante :
$ sed 5,$d file

supprime les lignes à partir de la 5ème.

On peut grouper les commandes :

$ sed -e '/^a/,/^b/ { /^av/d; s/aa/a/g; /b/d; }' file

cette commande :

  • n'agit que depuis la première ligne commençant par un a à la première commençant par un b ;
  • y supprime les lignes commençant par av ;
  • remplace 2 a par un seul ;
  • supprime les lignes contenant un b ;
  • laisse tout le reste inchangé

On peut utiliser les expressions régulières et adresser des motifs. Pour adresser un motif, l'encadrer par \( et \) (:!: attention aux \ devant les parenthèses).

$ sed -e 's/a\(.*\)/\1/g;' file

Exemples

On a déjà vu comment modifier les fins de lignes d'un fichier avec tr(1). Avec la version GNU sed(1), il y a une solution simple :

$ sed -e 's/\x0D$//' winfile.txt > unixfile.txt

Avec les versions standards, il faut un peu ruser.

Pour supprimer les lignes vides :

$ sed -e '/^$/d' file
La version GNU sed(1) a une option -i qui permet d'éditer un fichier in place :
$ sed -i -e '...' file

modifie suivant la commande à éxecuter (-e '…') le fichier file.

Supprimer le BOM (avec GNU sed(1)) :

$ sed -i -e "1s/^\xef\xbb\xbf//" file

Autres actions

L'ajout, le changement et l'insertion s'utilisent peu sans passer des scripts (au sens fichier cette fois). Nous avons vu les commandes de suppression d et de substitution s mais on peut aussi ajouter a, changer c ou insérer i.

enseignement/lea/cours/informatique/linux/sed.txt · Dernière modification: 2010/10/18 16:55 par Pascal Cabaud