Initiation à Sed

1) Introduction

Sed (Stream EDitor) est un éditeur de fichiers texte non interactif. Sed travaille à partir d'un fichier ou de stdin et lit chaque ligne une à une. Il applique ensuite les commandes d'édition souhaitées et renvoie le résultat dans un fichier ou stdout. Il existe plusieurs façons de lancer sed :
  • sed 'instructions d'édition' fichier
  • sed -f fichierdecommande fichier
  • commande | sed'instructions d'édition'
Par défaut, sed agit sur toutes les lignes mais il est possible de préciser une sélection de lignes : sed 'sélectioninstructions d'édition' La sélection peut être égale à : * une seule ligne 4 : la ligne 4 de l'entrée $ : la dernière ligne de l'entrée * une série de lignes 4,7 : de la ligne 4 à la 7 * une expression régulière pour sélectionner une série de lignes /titi/ : toutes les lignes contenant "titi" * une série utilisant des expressions régulières /^euros/,yens$/ : depuis la première ligne commençant par "euros" jusqu'à la dernière se terminant par "yens" Prenons le fichier ci-dessous comme exemple : Prénom,Nom<-tab->12345 test.txt Bernard, Framboisier    42875 Jean, Corbier    52543 Ariane, Carlettin    35543 Pat, Leguen    23355  

2) La substitution

s/chainerecherchee/nouvellechaine/g le "/g" sert à remplacer toutes les occurrences de chaque lignes, sans lui, seule la première occurrence de chaque ligne est modifiée. ex: remplace la première occurrence de chaque ligne de Bernard par Bernardo sed 's/Bernard/Bernardo/' test.txt Bernardo, Framboisier   42875 Jean, Corbier   52543 Ariane, Carlettin        35543 Pat, Leguen     23355 ex: ajoute Tel: devant chaque numéro de téléphone sed '/[0-9]/s//Tel: &/' test.txt Bernard, Framboisier    Tel: 42875 Jean, Corbier   Tel: 52543 Ariane, Carlettin        Tel: 35543 Pat, Leguen     Tel: 23355 ex: retire les prénoms de la liste sed 's/^.*, //' test.txt Framboisier     42875 Corbier 52543 Carlettin        35543 Leguen  23355  

3) print

l'instruction print est utile pour n'imprimer qu'une sélection du fichier. ex: n'affiche que les lignes contenant "55" sed -n '/55/p' test.txt Ariane, Carlettin        35543 Pat, Leguen     23355  

4) La suppression

SELECTION ex: supprime les lignes à partir de la 3ème sed '3,$d' test.txt Bernard, Framboisier    42875 Jean, Corbier   52543 ex: supprime toutes les lignes vierge sed '/^$/d' test.txt Bernard, Framboisier    42875 Jean, Corbier   52543 Ariane, Carlettin        35543 Pat, Leguen     23355  

5) L'insertion et la modification

SELECTION[i|a|c]\ texte i pour insérer un texte avant la ligne indiquée a pour insérer un texte après la ligne indiquée c pour remplacer un texte à la ligne indiquée ex: ajoute du texte après la ligne 2 sed '2a\ > test' test.txt Bernard, Framboisier    42875 Jean, Corbier   52543 test Ariane, Carletti        35543 Pat, Leguen     23355 ex: ajoute une ligne blanche après chaque phrase (ponctuée par un retour chariot) sed G test.txt Bernard, Framboisier    42875 Jean, Corbier   52543 Ariane, Carlettin        35543 Pat, Leguen     23355  

6) Les instructions multiples

Il est possible d'indiquer plusieurs instructions dès lors que chacune d'entre elles occupe une ligne distincte. ex: ajoute toto à la fin des lignes commencant par A, B, C ou D et titi à la fin des lignes commencant par une autre lettre sed '/^[A-D]/s/$/ toto / > /^[E-Z]/s/$/ titi /' test.txt Bernard, Framboisier    42875 toto Jean, Corbier   52543 titi Ariane, Carletti        35543 toto Pat, Leguen     23355 titi  

7) Les tampons

La commande sed possède deux espaces tampons qui permettent de stocker du texte : le "pattern space" (= espace de travail) et le "hold space" dans lequel du texte peut être stocké temporairement. ex: print "1\n2" | sed '/1/{ > h # stocke la ligne sélectionnée dans le hold space > d > } > /2/G' # ligne 2 + hold space 2 1  

8) Memento SED

 Sed

 Commandes  Description
[1] signifie que la commande ne peut être précédée que d’une seule adresse [2] la commande peut être précédée d’un domaine d’adresse : adresse,adresse 
[1]a\ toto ajoute le texte toto après la ligne indiquée
[2]b [étiq] se branche à l’étiquette etiq ; si l’on ne précise pas d’étiquette, on se branche à la fin du programme
[2]c\ toto substitue le texte courant par toto
:etiq définit une étiquette
[2]d supprime la ligne
[2]D supprime la première ligne du domaine sélectionné
[2]h remplace le contenu du hold space par celui du pattern space
[2]H ajoute le contenu du hold space à celui du pattern space
[2]g remplace le contenu de l’espace du pattern space par le contenu du hold space
[2]G ajoute le contenu du pattern space par le contenu du hold space
[1]i\ toto ajoute le texte toto avant la ligne indiquée
[2]l imprime la ligne, en visualisant tous les caractères
[2]n imprime la ligne
[2]N ajoute les lignes sélectionnées à l’espace des modèles en les séparant d’un saut de ligne
[2]p imprime la ligne
[2]P imprime la première ligne du texte sélectionné
[1]q quitte sed
[1]r fichier Lit le fichier et copie son contenu sur la sortie
[2]s/expreg/chsub/[drapeaux] substitue la chaîne correspondant à l’expression régulière expreg par la chaîne chsub
Le séparateur / peut être remplacé par un séparateur quelconque. Dans la chaîne ch_sub, le caractère & correspond à la chaîne trouvée. Dans la chaîne ch_sub, l’expression \n correspond à la nième sousexpression \(...\) de l’expression régulière exp_reg. Les drapeaux suivants sont supportés : n Le remplacement porte seulement sur la nième occurrence g Remplace toutes les occurrences de la ligne p Toutes les occurrences sont affichées w fic Ecrit dans le fichier fic les lignes substituées
[2]t [etiq] saut à l’étiquette etiq si une substitution a été faite dans la ligne courante
[2]w nomdefichier écrit la ligne dans le fichier nomdefichier
[2]x permute le pattern space et le hold space
y/ch1/ch2/ remplace chaque caractère de ch1 par le caractère correspondant de ch2
[1]= affiche le numéro de la ligne courante
[2]!cmd exécute cmd si la ligne n’est pas sélectionnée

Sed (cas concrets)

 Commandes  Description
sed "s/\ \ */\ /g" fichier.in > fichier.out remplace deux blancs (\<espace>) ou plus  par un seul blanc
sed 's/[ctrl + v][ctrl + m]//g' fichier.in > fichier.out supprime les retours chariots (^M) venant de fichiers DOS ou mal transférés (binaire / ascii)
sed "/^$/d" fichier.in > fichier.out supprimer les lignes vides
sed -n '1,${p;n;}' fichier affiche une ligne sur deux du fichier fichier
sed -n \$= fichier compte le nombre de ligne que contient le fichier fichier (équivalent de wc -l mais sans les espaces générés par le résultat de wc)
sed 's/\/\///g;s/#//g' fichier supprime les commentaires (# et //) dans le fichier fichier