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
SELECTIONd
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 |