Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
sed
signifie Stream EDitor, autrement dit éditeur de flux et plus précisément éditeur de flux orienté ligne.
sed
est souvent défini comme un éditeur de texte en ligne non-interactif.
sed
est une évolution de l'éditeur ed lui-même précurseur de vi, la syntaxe n'est franchement pas très conviviale, mais il permet de réaliser des commandes complexes sur de gros fichiers.
La commande sed
est une commande très riche, ne vous sont présentées ici que les fonctions les plus courantes, pour plus de détails faites un :
$ man sed
La syntaxe de sed est la suivante:
sed <option> <commande ou programme sed> <fichier_a_traiter>
Option | Commentaires |
---|---|
-n | Écrit seulement les lignes spécifiées (associé à l'option /p) sur la sortie standard |
-e | Ajoute une commande à la liste des commandes que doit exécuter sed sur le fichier. |
-f | Les commandes sont lues à partir d'un fichier préalablement rédigé. |
-i | Le fichier est édité sur place. Sinon, le fichier n'est pas édité, une copie de son contenu est éditée et renvoyée sur la sortie standard. |
s/ (Substitution) | Commande de substitution (remplace les caractères définis par l'ensemble de la commande sed). |
/g (Global) | Traite toutes les occurences définie (par défaut : seule la première occurence définie est traitée). |
/p (Print) | Imprime (affiche) la ligne traitée (utile avec l'option -n) |
/w <fichier> | Écrit la ligne dans le <fichier> specifié en plus de la sortie standard. |
! (point d'exclamation : “!” ) | Commande de négation (inversion des caractéristiques de la commande sed) |
d (Delete) | Efface les lignes (au niveau de la sortie, le fichier d'origine n'est pas modifié) |
a\<texte> | Écrit le <texte> après la ligne |
i\<texte> | Écrit le <texte> avant la ligne |
q (Quit) | Quitte la commande sed |
= (signe égal : = ) | Indique le numéro des lignes traitées |
num (Un chiffre) | Indique le numéro de la ligne à traiter ou bien le numéro d'ordre de l'occurence à traiter |
$ | Indique la dernière ligne du fichier traité |
\t | Indique une tabulation |
Pour réaliser les exemples qui suivront sur votre pc, en session user, rédigez un fichier test1.txt ainsi :
$ cat >> ~/test1.txt <<EOF
toto et titi aiment les abricots. toto préfère les Fraises. titi les cerises. TOTo et TITI sont des chipoteurs du jardin. EOF
Voir : la commande cat
L'option -i
est la fonction d'écriture de SED. Si elle n'est pas spécifiée, le fichier traité ne sera pas modifié.
Syntaxe :
sed -i <programme_sed> <fichier_a_traiter>
-e
permet de spécifier les commandes à appliquer sur le fichier.
Cette option est utile lorque vous appliquez plusieurs commandes.
Afin d'eviter que le shell interprète certains caracteres, il faut mieux encadrer la commande avec des apostrophes simples ou doubles : '
ou “
.
Syntaxe :
sed -e <programme_sed> <fichier_a_traiter>
Exemple :
$ sed -e "s/[Tt][Oo]/ton/g" test1.txt
tonton et titi aiment les abricots. tonton préfère les Fraises. titi les cerises. tonton et TITI sont des chipoteurs du jardin.
Où :
"s/[Tt][Oo]/ton/g"
est la commande sed
substituant (s/
) les chaînes de caractère :
TOTO TOTo toto
en :
tonton
sur la globalité du fichier, (c'est à dire toutes les lignes) (/g
).
-e
n'est pas nécessaire quand vous n'avez qu'une seule fonction d'édition.
L'option -f permet d'appliquer la rédaction d'un programme sed
déjà rédigé dans un fichier (dit : <fichier_programme> dans le tuto).
Syntaxe :
sed -f <fichier_programme> <fichier_a_traiter>
Créer un fichier représentant l'écriture de la commande sed
à envoyer :
$ cat >> ~/test2.txt <<EOF
s/[Tt][Oo]/ton/g s/[Tt][Ii]/ti/g s/Fraises/fraises/ EOF
Application de la commande sed
avec l'option -f
invitant à appliquer la commande rédigée dans le fichier test2.txt :
$ sed -f test2.txt test1.txt
tonton et titi aiment les abricots. tonton préfère les fraises. titi les cerises. tonton et titi sont des chipoteurs du jardin.
Vous disposez de l'option ”-n
“ qui supprime la sortie standard par défaut.
sed va écrire uniquement les lignes concernées par le traitement (sinon il écrit tout, même les lignes non traitées).
Utile avec l'option ”p
“ qui permettra elle de visualiser le traitement du fichier.
Syntaxe :
sed -n <fichier_programme>/p <fichier_a_traiter>
Exemple :
$ sed -n s/Fraises/fraises/ test1.txt
Bien que traité, rien n'apparait.
Avec la fonction p :
$ sed -n s/Fraises/fraises/p test1.txt
toto préfère les fraises.
Seule la ligne traitée est affichée.
La fonction de substitution ”s
“ permet de changer la première ou toutes les occurences d'une chaîne par une autre.
Syntaxe :
sed <option> "s/ <fichier_programme>" <fichier_a_traiter>
$ sed -e "s/toto/TOTO/" test1.txt
va changer la première occurence de la chaîne toto par TOTO (uniquement la première chaîne toto rencontrée dans le texte), et affichera ceci :
TOTO et titi aiment les abricots. toto préfère les Fraises. titi les cerises. TOTo et TITI sont des chipoteurs du jardin.
$ sed "s/toto/TOTO/2" test1.txt
va changer la seconde occurence de la chaîne toto par TOTO (uniquement la seconde chaîne toto rencontrée dans le texte)
toto et titi aiment les abricots. TOTO préfère les Fraises. titi les cerises. TOTo et TITI sont des chipoteurs du jardin.
$ sed "s/toto/TOTO/g" test1.txt
g = global
g
va changer toutes les occurences de la chaîne toto par TOTO (toutes les chaînes toto rencontrées seront changées)
$ sed "s/toto/TOTO/p" test1.txt
en cas de remplacement la ligne concernée est affichée sur la sortie standard (uniquement en cas de substitution)
$ sed "s/toto/TOTO/w resultat" test1.txt
en cas de substitution la ligne en entrée est inscrite dans un fichier résultat
$ sed "s/toto/TOTO/w resultat1.txt" test1.txt
TOTO et titi aiment les abricots. TOTO préfère les Fraises. titi les cerises. TOTo et TITI sont des chipoteurs du jardin.
Lecture du fichier résultat1.txt créé :
$ less resultat1.txt
TOTO et titi aiment les abricots. TOTO préfère les Fraises.
La fonction de substitution peut aussi être utilisée avec une expression régulière.
Voir : regexp
$ sed -e "s/[Ff]raises/FRAISES/g" test1.txt
substitue toutes les chaînes Fraises ou fraises par FRAISES
$ sed -e "s/^/#/" test1.txt
#toto et titi aiment les abricots. #toto préfère les Fraises. #titi les cerises. #TOTo et TITI sont des chipoteurs du jardin.
Ainsi, nous avons commenté l'ensemble des lignes du fichier test1.txt.
$ sed -e "3s/^/#/" test1.txt
toto et titi aiment les abricots. toto préfère les Fraises. #titi les cerises. TOTo et TITI sont des chipoteurs du jardin.
Ainsi, nous avons commenté uniquement la 3ème ligne du fichier test1.txt.
La fonction de suppression d
supprime les lignes comprises dans un intervalle donné.
Syntaxe :
sed <fichier_programme>d <fichier_a_traiter>
Exemple :
$ sed "2,4d" test1.txt
Cette commande va supprimer les lignes 2 à 4
du <fichier>.
On peut utiliser les expressions régulières:
$ sed "/toto/d" test1.txt
Cette commande supprime les lignes contenant la chaîne toto
.
Si, à l'inverse, on ne veut pas effacer les lignes contenant la chaîne toto (toutes les autres sont supprimées), on tapera:
$ sed "/toto/!d" test1.txt
La commande ”p
“ (print) affiche la ligne sélectionnée sur la sortie standard. Elle invalide l'option ”-n
“.
Voir option n précédente.
La commande ”l
“ (list) affiche la ligne sélectionnée sur la sortie standard avec en plus les caractères de contrôles en clair avec leur code ASCII (deux chiffres en octal).
$ sed l test1.txt
toto et titi aiment les abricots.$ toto et titi aiment les abricots. toto pr\303\251f\303\250re les Fraises.$ toto préfère les Fraises. titi les cerises.$
La commande ”=
“ donne le numéro de la ligne sélectionnée sur la sortie standard.
$ sed = test1.txt
1 toto et titi aiment les abricots. 2 toto préfère les Fraises. 3 titi les cerises. 4 TOTo et TITI sont des chipoteurs du jardin.
$ sed "/toto/=" test1.txt
Cette commande va afficher le numéro des lignes contenant la chaîne toto
ainsi :
1 toto et titi aiment les abricots. 2 toto préfère les Fraises. titi les cerises. TOTo et TITI sont des chipoteurs du jardin.
sed
.
La fonction ”q
“ (quit) va interrompre l'exécution de sed, la ligne en cours de traitement est affichée sur la sortie standard (uniquement si l'option ”-n
“ n'a pas été utilisée).
~$ sed "/cerises/q" test1.txt
toto et titi aiment les abricots. toto préfère les Fraises. titi les cerises.
La fonction ”r
“ (read) lit le contenu d'un fichier et écrit le contenu sur la sortie standard.
$ sed r test1.txt
toto et titi aiment les abricots. toto préfère les Fraises. titi les cerises. TOTo et TITI sont des chipoteurs du jardin.
La fonction ”w
“ (write) écrit la ligne sélectionnée dans un fichier.
Par exemple :
$ sed "/^toto/w resultat2.txt" test1.txt
Cette commande va écrire dans le fichier resultat2.txt
toutes les lignes du fichier test1.txt commençant par la chaîne toto.
La fonction ”i
“ (insert) va placer un texte avant la ligne sélectionnée.
Syntaxe :
i\le texte
Exemple :
$ sed 1i\ Début test1.txt
Début toto et titi aiment les abricots. toto préfère les Fraises. titi les cerises. TOTo et TITI sont des chipoteurs du jardin.
La fonction ”a
“ (append) va placer un texte après la ligne sélectionnée.
Syntaxe :
a\le texte
Exemple :
$ sed 4a\ Fin test1.txt
toto et titi aiment les abricots. toto préfère les Fraises. titi les cerises. TOTo et TITI sont des chipoteurs du jardin. Fin
Vous pouvez appeler la fonction i
ou a
dans un fichier de commande sed.
Exemple :
Soit un fichier prog.sed rédigé ainsi :
$ cat >> ~/test3.txt <<EOF
1i\\ début du traitement s/[Tt][Oo]/ton/g s/Fraises/fraises/ \$a \\ fin du traitement\\ EOF
On exécute la commande en tapant :
$ sed -f test3.txt test1.txt
début du traitement tonton et titi aiment les abricots. tonton préfère les fraises. titi les cerises. tonton et TITI sont des chipoteurs du jardin. fin du traitement
la commande rédigée dans le fichier test3.txt a pour effet d'inscrire avant la première ligne (1i) le texte :
début de traitement
et après la dernière ligne ($a) le texte :
fin du traitement
de notre fichier. test1.txt
La commande:
sed -e "s/\ ([0-9][0-9]*\ )/aa\ 1aa/" <fichier>
La sous-expression (sous-chaîne) \ ([0-9][0-9]*\) désigne un ou plusieurs chiffres, chacun sera entouré des caractères aa.
La chaîne :
to2to
deviendra :
toaa2aato.
Tous mes remerciements à Malekal_morte et captnfab pour leurs sciences et patiences et à l'équipe redoutable d'adrien, appzer0 et morphalus sur le salon toujours souriant du chan #slackware-fr.