no save
Assistance
Achat
News

FAQ | Sed

Sed - Trucs et astuces
Publié par jipicy, dernière mise à jour jeu. 05 nov. 2009 à 20:11:20 par marlalapocket


Substitution
Affichage
Suppression
Espace et tabulation
Ligne vide
Intervalle régulier
Divers
Joindre des lignes
Affichage insensible à la casse


Substitution

Substituer "foo" par "bar" à chaque ligne
Seulement la 1ère occurrence
sed 's/foo/bar/'
Seulement la 3ème occurrence
sed 's/foo/bar/3'
Toutes les occurrences
sed 's/foo/bar/g'
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'
sed '1,5!d'
La dernière ligne (tail -1)
sed -n '$p'
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 ou une expression régulière
sed -n '/motif/p'
sed '/regexp/!d'
Seulement les lignes ne matchant pas un motif ou une expression régulière
sed -n '/motif/!p'
sed '/regexp/d'
La ligne précédent un motif ou une expression régulière
sed -n '/motif/{g;1!p;};h'
La ligne suivant un motif ou une expression régulière
sed -n '/regexp/{n;p;}'
Suppression
Espace et tabulation

Éliminer les espaces et tabulations
En début de ligne
sed 's/^[ \t]*//
sed 's/^\s*//' # Utilisation du paramètre "\s"
En fin de ligne
sed 's/[ \t]*$//'
En début et fin de ligne
sed 's/^[ \t]*//;s/[ \t]*$//'
Ligne vide

Éliminer les lignes vides
Toutes les lignes vides
sed '/^$/d'
sed '/./!d'
Uniquement celles d'en tête
sed '/./,$!d'
sed -nr '/./,$s/(.*)/\1/p' # merci Adrien
Uniquement celles de fin
sed -e :a -e '/^\n*$/ {$d;N;ba' -e '}'
Intervalle régulier

Éliminer une ligne à intervalles réguliers
Toutes les lignes paires
sed '1~2d'
Toutes les lignes impaires
sed '2~2d'
Toutes les n lignes à partir de la ligne n
sed '3~2d' # Toutes les 2 lignes à partir de la ligne 3
Divers
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
(Afficher uniquement les lignes correspondant à un motif donné avec insensibilité à la casse)

Cette astuce fait suite à cette discussion sur le forum Linux/Unix

La commande "sed" possède bien un "flag" - voir Sed - Introduction à SED - Part I - permettant de mettre en correspondance un motif sans tenir compte de la casse, mais ce flag ne s'applique qu'à la seule commande de substitution (commande s) malheureusement.

Voilà donc une astuce permettant de se servir de ce flag pour afficher (ou au contraire 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


À compléter...
Version Web
Réalisé par RedShift
no save