un tutoriel sed

Creation: 16 decembre 2014
Mise à jour: 3 decembre 2014
Version: 1.3
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2014 Jean-Louis BICQUELET-SALAÜN

Le sed d'AIX

utilisation

sed peut s'utiliser en multilignes.

Ceci  est un texte d'essai. Il est à utiliser pour des tests.

sed -n  's/a/A/g
            s/e/E/g
            s/o/O/g'> > < text.txt
CEci  Est un tExtE d'EssAi. Il Est à utilisEr pOur dEs tEsts.

sed peut s'utiliser avec un autre caractère que , par exemple : , &, @ ou # pourvu que vous n'ayez pas ce caractère dans la ligne.

sed 's:à:A:g'  < text.txt
Ceci  est un texte d'essai. Il est A utiliser pour des tests.
sed 's#e#E#g' < text.txt
CEci  Est un tExtE d'Essai. Il Est à utilisEr pour dEs tEsts.

sed peut servir d'interpreteur de script et on peut ecrire un fichier transform

#!/bin/sed -f
 s/a/A/g
 s/e/E/g
 s/i/I/g
 s/o/O/g
 s/u/U/g

et executer celui-si

 transform text.txt

On peut même passer un argument au script. Si on crée un fichier sedgrep et qu'on le rend executable on peut taper:

 #!/bin/sh
sed -n 's/'"$1"'/&/p'

 ./sedgrep sed < sedgrep
sed -n 's/'"$1"'/&/p'

sed peut servir de here document avec substitution, même si cat le fait aussi bien

 value=3
 sed  's/X/'$value'/' < EOF
la valeur est 3

résumé rapide

commandes sed

: label label
# commentaire commentaire
{ ... } défini un bloc
= affiche les numéros de lignes
a \ ajoute du texte
c\ change
d ou D supprime
i\ insère
p ou P affiche
q quitter
x échange
s/.../.../ substitue
y/.../.../ transforme
g ou G get
h ou H hold
n ou N next
b label va jusqu'au label
t label test et va jusqu'au label
r filename lit un fichier
w filename écrit un fichier

méchanisme de selection

/string/ recherche une chaine sed -n '/Jean/ p' text.txt
/debut/,/fin/ recherche d'un bloc de texte entre 2 marqueurs sed -n '/est/,/oui/p' text.txt
num_ligneaffiche la ligne sed -n '1p' text.txt
de,aaffiche entre les lignes sed -n '1,3p' text.txt

caractèressignification
^début de ligne
$fin de ligne
1début de fichier
$fin de fichier

Pour n'afficher que la première ligne on supprime tout de la 2 eme ligne à la fin ($).

sed '2,$d' fichier

Sed Pattern

/g substitusion générale répétée
/I ignore case
/P print affiche
/w filename écrit le fichier

Sed options

-n supprime l'affichage
-u supprime le buffering
-e script utilise la variable script
-f script utilise le fichier script

Sed et expressions régulières

s/\(.*\):\(.*\)afficher la dernière colonne d'un fichier séparé par de la caractère :
s/\(.*\) \(.*\) \(.*\)/ \1 \2 \3 rechercher 3 mots séparés par des espaces et les met dans l'ordre
s/\(.*\) \(.*\) \(.*\)/ \1 \2 \3 rechercher 3 mots séparés par des espaces et les inverses
s/\(.*\) \(.*\) \(.*\) (.*\) \(.*\) \(.*\)/\4 ne garder que le quatrième
s/\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\)/[\3]/ ne garder que le troisème entre crocher
s/\(.*\)=\(.*\)/\2/afficher la valeur correspondant à une affectation ( caractère =)
s/\(.*\)=\(.*\)/\2 \2/ afficher plusieures fois la même valeur
s/.*FREE PPs:.*(\([0-9][0-9]*\) megabytes.*/\1/pexpression régulière cherchant la valeur entre FREE PPS et megabytes

commandes sed souvent utilisées

/^$/d supprimer une ligne vide
/^#/d supprimer une ligne commençant par un commentaire
1,8d supprimer les lignes 1 à 8
s/windows/linux/ remplacer windows par linux pour la première instance trouvée
s/windows/linux/g remplacer tous les windows par linux
s/from/to/3 remplacer la troisème occurence de from
/line/s/from/to/g remplacer from par to pour toutes les lignes qui contiennent line
/line/s!/from/to/gremplacer from par to pour toutes les lignes qui ne contiennent pas line
s/from/to/g; s/from2/to2/g multi remplacment
/john/ n'afficher que les lignes contenant john
/doe/dsupprime toutes les lignes contennat doe
s/ *$//supprimer tous les espaces en fin de ligne
s/00*/0/g compresse tous les 0 trouvées par un seul zéro
s/ */ /gréduire les espaces entre chaine à un seul blanc
s/mot//gsupprime tous les mots mot
/WORD/ a\
traduction mot
ajoute une ligne après chaque mot trouvé WORD
/WORD/ i\
traduction mot
ajoute une ligne avant chaque mot trouvé WORD
1i\
> entete
ajouter une ligne en entete
1a\
> entete
ajouter une ligne après la première ligne
/pattern/G insèrer une ligne blanche après le pattern quand il est trouvé
1!G;h;$!dafficher le texte à l'envers
$!N;s/\n/ /joindre les lignes deux à deux
q afficher la première ligne du fichier
10q " afficher les 10 premières lignes
$!Dafficher la dernière ligne d'un fichier
$!N;$!D afficher les 2 dernières lignes d'un fichier
/pattern/p afficher les lignes qui correspondent au pattern
/pattern/!d afficher les lignes qui correspondent au pattern
/AAA/!d; /BBB/!d; /CCC/!dgrep pour 3 patterns dans n'importe quel ordre

cookbook sed

Le fichier de test text.txt contient le texte suivant et sera utilisé pour nos exemples.

Ceci  est un texte d'essai. Il est à utiliser pour des tests.
Jean-Louis

s

recherche d'un pattern donné (grep)

sed -n 's/est/&/p'  text.txt
Ceci  est un texte d'essai. Il est à utiliser pour des tests.
sed -n 's/toto/&/p' < text.txt
sed -n 's/est/&/p' < text.txt
Ceci  est un texte d'essai. Il est à utiliser pour des test

On remarque que l'indirection n'est pas utile.

Pour ne conserver qu'un seul blanc entre les mots.

echo "Un phrase avec des      blancs." | sed "s/  */ /g"
Un phrase avec des blancs.

p

On peut faire de même avec l'option p:

sed -n '/Jean/ p' text.txt
Jean-Louis

On peut afficher le texte compris entre un marqueur de début et fin.

sed -n '/est/,/oui/p' text.txt
Ceci  est un texte d'essai. Il est à utiliser pour des tests.
Jean-Louis

=

compter le nombre de lignes (wc -l)

sed -n '$=' text.txt
2

afficher les lignes avec leur numéros

#sed '=' text.txt
1
Ceci  est un texte d'essai. Il est à utiliser pour des tests.
2
Jean-Louis

d

supprimer toutes les lignes de 2 à 10

sed '2,10/ d' 
sed '2,10!p'

supprimer toutes les lignes vides

sed '/^$/ d' 

faire un head

pour faire un head -n 10 on émule la commande en supprimant les lignes husqu'à la fin du fichier à partir de la ligne 11.

sed '11,$d' 

i ou a

Avec i on peut ajouter une ou plusieures lignes à la suite d'une ligne donnée. Il faut terminer les lignes à ajouter par le caractère \.

 sed '1i\
        =========================\
         programme\
        =========================' test
 =========================
 programme
 =========================
if ! test \( -n $1 \) -a \( -e $1 \)  ; then
   echo "erreur"
fi

Avec i on insère avant la ligne souhaitée.

Avec a on insère après la ligne souhaitée.

c

changer une ligne de texte lorsqu'on rencontre un modif

sed '/Jean-Louis/ c\
 signature' text.txt
Ceci  est un texte d'essai. Il est à utiliser pour des tests.
signature

ou a une ligne donnée

sed '1 c\
 entete
 ' text.txt
entete
Jean-Louis

commandes complexes

On va utiliser un fichier test.txt.

nom:
john
nom:
doe
nom:
alpha

numérotation des lignes du fichier

  1. Pour afficher le fichier en le numérotant cadré à droite:

    #sed = test.txt | sed 'N; s/^/     /; s/ *\(.\{6,\}\)\n/\1  /'
         1  nom:
         2  john
         3  nom:
         4  doe
         5  nom:
         6  alpha
    

  2. Pour afficher le fichier en le numérotant cadré à gauche:

    #sed = test.txt | sed 'N;s/\n/ /'
    1 nom:
    2 john
    3 nom:
    4 doe
    5 nom:
    6 alpha
    

  3. Pour ne numéroter que les lignes non vides:

     #sed '/./=' test.txt | sed '/./N; s/\n/ /'
    1 nom:
    2 john
    
    4 nom:
    5 doe
    
    7 nom:
    8 alpha
    

joindre les lignes

différentes manières de joindre les lignes:

  1. Pour joindre les ligne deux à deux

     sed '$!N;s/\n/ /' test.txt
    nom: john
    nom:doe
    nom: alpha
    

  2. Pour joindre les lignes qui se perminent par le caractère ::

    #sed -e :a -e '/:$/N; s/:\n/:/; ta' test.txt
    nom:john
    
    nom:doe
    
    nom:alpha
    

  3. Pour joindre les lignes qui se terminent par \

    #sed -e :a -e '/\\$/N; s/\\\n//; ta' test.txt
    nom: john
    
    nom:
    doe
    
    nom:
    alpha
    

des commandes de mises en forme de l'affichage

  1. ajoute des points toutes les 3 décimales

    Cela permet typiquement de formater les grands nombres au format français avec . ou anglais ,.

    #echo 54457772 |sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1.\2/;ta'
    54.457.772
    

  2. mettre en forme la date ou extraire l'heure

    # date |sed  's/\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\)/\3 \2 \6/'
    16 Dec 2014
    # date |sed  's/\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\)/ \4/'
    15:00:50
    

  3. inverser deux mots

    #echo "john est" | sed 's/\(.*\) \(.*\)/\2 \1/'
    est john
    

  4. pour extraire une valeur

    #echo "john=10" | sed 's/\(.*\)=\(.*\)/\2/'
    10
    #echo "john=10" | sed '/john/!p' | sed  's/\(.*\)=\(.*\)/\2/'
    10
    

  5. pour extraire la taille total ou l'espace libre d'un VG

    lsvg rootvg | sed -n 's/.*FREE PPs:.*(\([0-9][0-9]*\) megabytes.*/\1/p'
    704
    lsvg rootvg | sed -n 's/.*TOTAL PPs:.*(\([0-9][0-9]*\) megabytes.*/\1/p'
    17024
    

quelques émulations de commandes

  1. afficher les 5 dernières lignes d'un fichier (tail -n 5)

    #sed -e :a -e '$q;N;6,$D;ba' test.txt
    nom:
    doe
    
    nom:
    alpha
    

  2. Suppression des tags htmls (html2txt)

    #sed -e 's/<[^>]*>//g'
    

  3. unix2dos

    #sed 's/$/^M/' test.txt
    

  4. dos2unix

    #sed 's/\(.*\)..$/\1/' test.txt
    

    Attention, cette commande est à utiliser avec précaution.