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

[Linux] Création d’un LV et FS ext3