• 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.

      -n passe 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.txt

      si 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.txt

      Si 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.txt

      SUPPRESSIONS

      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.txt

      Pour 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/’ fichier

      Ici, y permet 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/’ fichier

       

       

      La 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,\l et \E

      Pour 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.txt

      Cela ne rajoute qu’une seule ligne de texte, mais peut contenir des sauts de lignes : \n ou \r

       

      - Ajouter toto sur une ligne avant celle contenant tata : sed ‘/tata/ i\ toto’ fich.txt

      Cela ne rajoute qu’une seule ligne de texte, mais peut contenir des sauts de lignes : \n ou \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, t veut dire : si une substitution a eu lieu, alors retour à :boucle

      Le & est la ligne elle-même, entourée de deux espaces.

       

      - Ligne suivante (n) : sed ‘/motif/ {n;p}’ fich.txt

      Test :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

       

      h Copie Principale dans Secondaire (correspond à >)

      H Ajoute Principale dans Secondaire (correspond à >>)

      g Copie Secondaire dans Principale (correspond à <)

      G Ajoute Secondaire dans Principale (correspond à <<)

      x Échange le contenu des 2 mémoires.

       

      Exemple :

      sed ‘

      /1/{ # si il y a un 1

      h # le copier dans la mémoire secondaire

      d # effacer le contenu de la mémoire principale

      }

      /2/{ # si il y a un 2

      G # 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’ fichier

      Mettre une virgule aux milles

      sed ‘s/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g’

       

 

Aucun commentaire

 

Laissez un commentaire