Niveau :      
Résumé : sed

Dans un récent article, je vous conseillais d'utiliser perl pour ne pas avoir à apprendre la syntaxe des autres outils. Oui, mais sed est bien supérieur à perl dans certains cas particuliers. Par conséquent il est tout de même bon de connaître quelques idiomes sed.

Ceci est une sélection d'unilignes en provenance de http://sed.sourceforge.net/sed1line.txt

Cherchez les équivalents perl, vous constaterez qu'ils sont souvent plus long si ce n'est plus lent.

Commençons par ceux qui vous seront le plus souvent utiles :

# remplace toto par tata dans toutes les lignes contenant titi
$ sed '/titi/s/toto/tata/g'

# remplace toto par tata dans toutes les lignes ne contenant pas titi
$ sed '/titi/!s/toto/tata/g'

# imprime les 10 premières lignes, comme le ferait head (utile pour comprendre la suite)
$ sed 10q

# imprimes toutes les lignes sauf celles entre "tata" et "toto"
$ sed '/tata/,/toto/d'

# imprime la ligne 52
$ sed -n '52p'                 # méthode 1
$ sed '52!d'                   # méthode 2
$ sed '52q;d'                  # méthode 3, arrête la lecture dès qu'elle a matché (pour la vitesse)

# supprime les 10 premières lignes
$ sed '1,10d'

# imprime les 10 dernières lignes, comme le ferait tail (plus difficile)
$ sed -e :a -e '$q;N;11,$D;ba'

La suite vous sera plus rarement utile, mais vous permettra de comprendre le fonctionnement de sed et donc de créer des fonctions bien plus complexes.

# imprime les 2 dernières lignes ("tail -2")
$ sed '$!N;$!D'

# imprime les lignes qui matchent (grep)
$ sed -n '/regexp/p'           # méthode 1
$ sed '/regexp/!d'             # méthode 2

# imprime les lignes qui ne matchent pas (grep -v)
$ sed -n '/regexp/!p'          # méthode 1
$ sed '/regexp/d'               # méthode 2

# imprime la ligne précédant le match
$ sed -n '/regexp/{g;1!p;};h'

# imprime la ligne succédant au match
$ sed -n '/regexp/{n;p;}'


# imprime une ligne sur 7 à partir de la 3e
$ gsed -n '3~7p'               # GNU sed only
$ sed -n '3,${p;n;n;n;n;n;n;}' # other seds

# supprime les 10 dernières lignes
$ sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # méthode 1
$ sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # méthode 2