Lignes de commande en sedContinuer à utiliser sed
Jul 18« « Trucs et astuces (2) | Trucs et astuces (3) » »
Par peck
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
Comments