-
BASH > sed
AFFICHAGE
Un point d’exclamation (
!) après un numéro de ligne, un motif ou une RegEx exclura cette ligne (ou intervalle) du traitement à effectuer.-npasse sed en mode silence, et donc n’affiche (p) que la ligne matchée.- Afficher la 3ème ligne :
sed -n 3p fich.txt- Toutes les 2 lignes, en commençant par la 1ère :
sed 1~2p fich.txt- Dernière ligne :
sed ‘$ p’ fich.txt- Lignes avec toto :
sed ‘/toto/p’ fich.txt- Lignes 3 à 6 :
sed ‘3,6 p’ fich.txt- Lignes entre 2 motifs (inclus) :
sed ‘/motif1/,/motif2/ p‘ fich.txt
Si l’intervalle contenant les 2 motifs se répète plusieurs fois, sed appliquera les instructions à chaque intervalle successivement.- Lignes comprises entre la 2ème ligne et toto :
sed ‘2,/toto/ p’ fich.txtsi toto n’est pas trouvé, les instructions sont appliquées à chaque ligne en partant de la 2ème ligne et ce jusqu’à la fin du fichier.
- Lignes comprises entre toto et la 8ème :
sed ‘/toto/,8 p’ fich.txtSi 8 est inférieur au numéro de ligne correspondant à toto, seul la ligne contenant toto est affichée.
- Afficher le numéro de la ligne (
=) :sed -n ‘/motif/=‘ fich.txtSUPPRESSIONS
d= delete- Supprimer la 5ème ligne :
sed ‘5d’ fich.txt- Supprimer la dernière ligne :
sed ‘$d’ fich.txt- Suppression des lignes 7à 9 :
sed ‘7,9d’ fich.txt- Supprimer la ligne contenant toto :
sed ‘/toto/d’ fich.txt- Supprimer tout sauf toto :
sed ‘/toto/!d’ fich.txt- Supprimer les lignes vides :
sed ‘/^$/d’ fich.txtPour ne supprimer que les doublons et garder une seule ligne vide :
sed ‘ /^$/{ N /^\n$/D }’ fich.txt- Supprimer la ligne contenant des caractères numériques (au moins 1 chiffre) situés en fin de ligne :
sed ‘/[0-9][0-9]*$/d’ fich.txt- Supprimer les lignes entre deux motifs (inclus) :
sed ‘/Début/,/Fin/d’ fich.txt- Supprimer les 4 dernières lignes :
sed -n ‘:s;1,3{N;bs};4,${N;P;D}’- Supprimer les 2 lignes précédant celle contenant toto :
sed '/toto/ !{:z;h;N;/toto$/ !b z;s/.*\n//;x;s/\(.*\)\n.*\n.*$/\1/;G}' fichier
SUBSTITUTION
- Remplacer le 1er toto par tata :
sed ‘s/toto/tata’ fich.txt- Remplacer tous les toto par tata (global) :
sed ‘s/toto/tata/g‘ fichier- Remplacer le 3ème toto par tata :
sed ‘s/toto/tata/3‘ fichier- Remplacer les toto, Toto, TOTO, bref, pas de case sensitive (
I) :sed ‘s/toto/tata/I‘ fichier- Remplacer les caractères accentués :
sed ‘y/àâéèêëîïôöùûüÀÂÉÈÊËÎÏÔÖÙÛÜ/aaeeeeiioouuuAAEEEEIIOOUUU/’ fichierIci,
ypermet de convertir un caractère de la chaîne source par son homologue, en lieu et place, de la chaîne destination.- Inverser les lignes d’un fichier :
sed -n ’1! G;$ p;h’ fichier- Remplacer toute la ligne contenant tata par toto (
c\) :sed ‘/tata/ c\ toto’ fichier- Mettre en majuscule la 1ère lettre de chaque ligne :
sed ‘s/^./\u$/’- Mettre en majuscule chaque mot :
sed -r ‘s/(\b.)/\U&/g’- Conversion DOS vers UNIX :
sed ‘s/^M$//’ fichier- Conversion UNIX vers DOS :
sed ‘s/$/^M/’ fichierLa partie droite n’accepte que trois valeurs pouvant être interpolées :
le caractère
&, les références arrières\1(de 1 à 9) et les options\U,\u,\L,\let\EPour interpréter littéralement une esperluette (
&) ou un anti-slash (\) il faut les préfixer par un anti-slash :\&ou\\AJOUT
- Ajouter toto sur une ligne après celle contenant tata :
sed ‘/tata/ a\ toto’ fich.txtCela ne rajoute qu’une seule ligne de texte, mais peut contenir des sauts de lignes :
\nou\r- Ajouter toto sur une ligne avant celle contenant tata :
sed ‘/tata/ i\ toto’ fich.txtCela ne rajoute qu’une seule ligne de texte, mais peut contenir des sauts de lignes :
\nou\r- Ajouter une ligne blanche après chaque ligne :
sed G fichier- Ajouter 2 lignes blanches après chaque ligne : sed ‘G;G’ fichier
- Insérer une ligne blanche avant chaque ligne contenant toto :
sed ‘/toto/{x;p;x}’ fichier- Insérer une ligne blanche après chaque ligne contenant toto :
sed ‘/toto/G’ fichier- Insérer une ligne blanche avant et après chaque ligne contenant toto :
sed ‘/toto/{x;p;x;G}’ fichier- Insérer un espace entre chaque lettre :
sed ‘s/\([^ ]\)/\1 /g’SUBTILITÉS
- Centrer du texte sur 20 colonnes (en ajoutant un espace avant et après) :
sed -e ‘:boucle;s/^.\{1,20\}$/ & /; t boucle’Ici,
tveut dire : si une substitution a eu lieu, alors retour à:boucleLe
&est la ligne elle-même, entourée de deux espaces.- Ligne suivante (
n) :sed ‘/motif/ {n;p}’ fich.txtTest :
echo -e "AAA\nBBB\nCCC\nDDD" | sed -n ‘/BBB/ {n;s/C/Z/2p}’- N’afficher que le troisième toto transformé en tata :
sed -n ‘3 s/toto/tata/p’- Affecter la modification sur la ligne suivante (
N) :sed ‘/titi/{N;s/toto/tata/}’Ici, nous recherchons la ligne contenant
titi. Puis, nous changeons toto par tata sur la ligne suivante.OPTIONS
- Affecter directement le changement dans le fichier :
sed -i- Traiter plusieurs fichiers un à un plutôt que comme une seule et même page :
sed -s- Mode silencieux. N’affiche que les occurrences trouvées avec p :
sed -n ‘… p’MEMOIRES TAMPONS
On peut stocker les lignes traitées dans des mémoires.
- Mémoire principale (pattern space) pour la ligne sélectionnée
- Mémoire secondaire (hold space) est une mémoire temporaire
hCopie Principale dans Secondaire (correspond à >)HAjoute Principale dans Secondaire (correspond à >>)gCopie Secondaire dans Principale (correspond à <)GAjoute Secondaire dans Principale (correspond à <<)xÉchange le contenu des 2 mémoires.Exemple :
sed ‘/1/{# si il y a un 1h# le copier dans la mémoire secondaired# effacer le contenu de la mémoire principale}/2/{# si il y a un 2G# ajouter la secondaire à la principale}Exemples
Substitution
Substituer "foo" par "bar" à chaque ligne
Seulement l’avant dernière occurrence : sed ‘s/\(.*\)foo\(.*foo\)/\1bar\2/’Seulement la dernière occurrence : sed ‘s/\(.*\)foo/\1bar/’
Substituer "foo" par "bar" seulement les lignes contenant "plop" : sed ‘/plop/ s/foo/bar/g’
Substituer "foo" par "bar" excepté les lignes contenant "plop" : sed ‘/plop/! s/foo/bar/g’
Substituer "Foo" ou "foo" par "bar" à chaque ligne : sed ‘s/[Ff]oo/bar/g’
Substituer "bleu" ou "blanc" ou "rouge" par "vert" : sed ‘s/bleu\|blanc\|rouge/vert/g’
Affichage
La 1ère ligne (head -1) : sed q
Les 5 premières lignes (head -5) : sed ’5q’
La dernière ligne (tail -1) : sed ‘$!d"
Les 5 dernières lignes (tail -5) : sed -e :a -e ‘$q;N;6,$D;ba’
Les 2 dernières lignes (tail -2) : sed ‘$!N;$!D’
Seulement les lignes matchant un motif : sed ‘/regexp/!d’
Seulement les lignes ne matchant pas un motif : sed ‘/regexp/d’
La ligne précédent un motif : sed -n ‘/motif/{g;1!p;};h’
La ligne suivant un motif : sed -n ‘/regexp/{n;p;}’
Suppression
Espace et tabulation
Éliminer les espaces et tabulations
En début de ligne : sed ‘s/^[ \t]*//En fin de ligne : sed ‘s/[ \t]*$//’
En début et fin de ligne : sed ‘s/^[ \t]*//;s/[ \t]*$//’
Éliminer les lignes vides
Toutes les lignes vides :sed ‘/^$/d’Uniquement celles d’en tête : sed ‘/./,$!d’ ou sed -nr ‘/./,$s/(.*)/\1/p’
Uniquement celles de fin : sed -e :a -e ‘/^\n*$/ {$d;N;ba’ -e ‘}’
Joindre des lignes
Joindre les lignes 2 par 2 : sed ‘$!N;s/\n//’Joindre les lignes 3 par 3 : sed ‘$!N;s/\n//;$!N;s/\n//;’
Si une ligne se termine par un backslash (\), ajouter la ligne suivante et remplacer la fin de ligne (\n) par un espace : sed -e :a -e ‘/\\$/N; s/\\\n/ /; ta’
Si une ligne commence par un signe égale (=), ajouter-là à la ligne précédente et remplacer le signe égale (=) par un espace : sed -e :a -e ‘$!N;s/\n=/ /;ta’ -e ‘P;D’
Affichage insensible à la casse
Voilà donc une astuce permettant de se servir de ce flag pour afficher (ou ne pas afficher) des lignes correspondant à un motif donné sans tenir compte de sa casse.
Il suffit pour cela d’employer la commande de substitution "s" combinée au métacaractère "&" et bien sur du flag "I".
Exemple pour n’afficher que les lignes contenant le terme "motif" (ou Motif, MOTIF, mOtIf, MoTiF, etc)
sed -n ‘s/motif/&/Ip’ fichierMettre une virgule aux milles
sed ‘s/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g’