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 →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:systeme:sed [01/08/2013 10:31] smolski [Préparation aux exemples d'illustration de ce tuto :] |
doc:systeme:sed [03/07/2014 00:06] 127.0.0.1 modification externe |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== sed ====== | ====== sed ====== | ||
- | * Objet : ''sed'' signifie //Stream EDitor//, autrement dit //éditeur de flux// et plus précisément //éditeur de flux orienté ligne//. | + | * Objet : sed |
- | * Niveau requis : TOUS | + | * Niveau requis : {{tag>débutant}} |
- | * Commentaires : // sed est un outil éditeur en ligne. // | + | * Commentaires : **sed** signifie //Stream EDitor//, autrement dit //éditeur de flux// et plus précisément //éditeur de flux orienté ligne//. |
- | * Débutant, à savoir : | + | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) |
- | * [[manuel:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | + | * Suivi : |
- | * [[manuel:bash]] En complément. | + | * Création par smolski 24-04-2010 |
+ | * Testé par smolski le 08-10-2013 | ||
+ | * Commentaires sur le forum : [[http://debian-facile.org/viewtopic.php?id=2508 | Lien vers le forum concernant ce tuto]]((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) | ||
+ | |||
+ | **Nota :** | ||
+ | |||
+ | Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | ||
===== Présentation ===== | ===== Présentation ===== | ||
''sed'' est souvent défini comme un éditeur de texte en ligne non-interactif. | ''sed'' est souvent défini comme un éditeur de texte en ligne non-interactif. | ||
- | - Il lit les lignes d'un fichier une à une (ou provenant de l'entrée standard), sans traiter nécessairement tout le texte du fichier en cours (comme le font [[manuel:vim]] ou [[manuel:nano]] par exemple) ; | + | - Il lit les lignes d'un fichier une à une (ou provenant de l'entrée standard), sans traiter nécessairement tout le texte du fichier en cours (comme le font [[:doc:editeurs:vim:vim]] ou [[:doc:editeurs:nano]] par exemple) ; |
- leur applique un certain nombre de commandes d'édition ; | - leur applique un certain nombre de commandes d'édition ; | ||
- et renvoie les lignes résultantes sur la sortie standard, __sans modification__ du fichier traité. | - et renvoie les lignes résultantes sur la sortie standard, __sans modification__ du fichier traité. | ||
Ligne 18: | Ligne 24: | ||
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 : | 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 : | ||
- | + | <code user>man sed</code> | |
- | $ man sed | + | |
Ligne 55: | Ligne 60: | ||
Pour réaliser les exemples qui suivront sur votre pc, en session user, rédigez un fichier test1.txt ainsi : | Pour réaliser les exemples qui suivront sur votre pc, en session user, rédigez un fichier test1.txt ainsi : | ||
- | <code bash> | + | <code user fichier_test1.txt> |
- | $ cat >> ~/test1.txt <<EOF</code> | + | cat >> ~/test1.txt <<EOF |
- | <code> | + | |
toto et titi aiment les abricots. | toto et titi aiment les abricots. | ||
toto préfère les Fraises. | toto préfère les Fraises. | ||
Ligne 65: | Ligne 69: | ||
</code> | </code> | ||
- | Voir : la commande [[cat]] | + | Voir : [[doc:systeme:cat | la commande cat]] |
==== Option -i ==== | ==== Option -i ==== | ||
Ligne 87: | Ligne 91: | ||
**Exemple :** | **Exemple :** | ||
- | <code bash> | + | |
- | $ sed -e "s/[Tt][Oo]/ton/g" test1.txt</code> | + | La commande : |
+ | <code user> | ||
+ | sed -e "s/[Tt][Oo]/ton/g" test1.txt</code> | ||
+ | |||
+ | Donne : | ||
<code>tonton et titi aiment les abricots. | <code>tonton et titi aiment les abricots. | ||
tonton préfère les Fraises. | tonton préfère les Fraises. | ||
Ligne 109: | Ligne 117: | ||
<note>L'option ''-e'' n'est pas nécessaire quand vous n'avez qu'une seule fonction d'édition.</note> | <note>L'option ''-e'' n'est pas nécessaire quand vous n'avez qu'une seule fonction d'édition.</note> | ||
+ | |||
+ | === Astuce === | ||
+ | |||
+ | En cas de confusion avec un chemin, genre ''/machin/truc/chouette '' __après l'option __ les séparateurs ''/ '' peuvent être remplacés par des caractères neutres, comme la virgule ou le dièse. Par exemple avec le chemin précédent : | ||
+ | sed -e 's#/machin/truc/chouette#/machin/truc/wouap#' | ||
+ | |||
+ | Evitant ainsi des confusions dans l'interprétation de la commande. | ||
+ | |||
+ | //Merci à //**enicar**// sur le chan df !// | ||
==== Option -f ==== | ==== Option -f ==== | ||
Ligne 116: | Ligne 133: | ||
**Syntaxe :** \\ | **Syntaxe :** \\ | ||
sed -f <fichier_programme> <fichier_a_traiter> | sed -f <fichier_programme> <fichier_a_traiter> | ||
+ | |||
+ | <note tip>Pour que les fichiers traités le soit réellement pensez à utiliser l'option ''-i''. Sinon, rien ne sera réalisé réellement.</note> | ||
=== Exemple : === | === Exemple : === | ||
Créer un fichier représentant l'écriture de la commande ''sed'' à envoyer : | Créer un fichier représentant l'écriture de la commande ''sed'' à envoyer : | ||
- | <code bash> | + | <code user fichier_test2.txt> |
- | $ cat >> ~/test2.txt <<EOF</code> | + | cat >> ~/test2.txt <<EOF |
- | <code> | + | |
s/[Tt][Oo]/ton/g | s/[Tt][Oo]/ton/g | ||
s/[Tt][Ii]/ti/g | s/[Tt][Ii]/ti/g | ||
Ligne 130: | Ligne 148: | ||
Application de la commande ''sed'' avec l'option ''-f'' invitant à appliquer la commande rédigée dans le fichier //test2.txt// : | Application de la commande ''sed'' avec l'option ''-f'' invitant à appliquer la commande rédigée dans le fichier //test2.txt// : | ||
- | <code bash> | + | <code user> |
- | $ sed -f test2.txt test1.txt </code> | + | sed -f test2.txt test1.txt </code> |
+ | |||
+ | Donne : | ||
<code>tonton et titi aiment les abricots. | <code>tonton et titi aiment les abricots. | ||
tonton préfère les fraises. | tonton préfère les fraises. | ||
Ligne 148: | Ligne 168: | ||
**Exemple :** | **Exemple :** | ||
- | <code bash> | + | <code user> |
- | $ sed -n s/Fraises/fraises/ test1.txt </code> | + | sed -n s/Fraises/fraises/ test1.txt </code> |
Bien que traité, rien n'apparait. | Bien que traité, rien n'apparait. | ||
Avec la fonction p : | Avec la fonction p : | ||
- | <code bash> | + | <code user> |
- | $ sed -n s/Fraises/fraises/p test1.txt </code> | + | sed -n s/Fraises/fraises/p test1.txt </code> |
+ | |||
+ | Donne : | ||
<code> | <code> | ||
toto préfère les fraises. | toto préfère les fraises. | ||
</code> | </code> | ||
+ | |||
Seule la ligne traitée est affichée. :-) | Seule la ligne traitée est affichée. :-) | ||
Ligne 166: | Ligne 190: | ||
**Syntaxe :** | **Syntaxe :** | ||
sed <option> "s/ <fichier_programme>" <fichier_a_traiter> | sed <option> "s/ <fichier_programme>" <fichier_a_traiter> | ||
+ | |||
+ | <note tip>Pour que les fichiers traités le soit réellement pensez à utiliser l'option ''-i''. Sinon, rien ne sera réalisé réellement.</note> | ||
=== Exemples : === | === Exemples : === | ||
- | <code bash> | + | <code user> |
- | $ sed -e "s/toto/TOTO/" test1.txt</code> | + | sed -e "s/toto/TOTO/" test1.txt</code> |
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 : | 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 : | ||
Ligne 181: | Ligne 207: | ||
---- | ---- | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed "s/toto/TOTO/2" test1.txt</code> | + | sed "s/toto/TOTO/2" test1.txt</code> |
va changer la __seconde__ occurence de la chaîne //toto// par **TOTO** (__uniquement__ la seconde chaîne //toto// rencontrée dans le texte) | va changer la __seconde__ occurence de la chaîne //toto// par **TOTO** (__uniquement__ la seconde chaîne //toto// rencontrée dans le texte) | ||
Ligne 193: | Ligne 219: | ||
---- | ---- | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed "s/toto/TOTO/g" test1.txt</code> | + | sed "s/toto/TOTO/g" test1.txt</code> |
''g = global'' \\ | ''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) | ''g'' va changer __toutes les occurences__ de la chaîne //toto// par //TOTO// (toutes les chaînes //toto// rencontrées seront changées) | ||
Ligne 201: | Ligne 227: | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed "s/toto/TOTO/p" test1.txt</code> | + | sed "s/toto/TOTO/p" test1.txt</code> |
en cas de remplacement la ligne concernée est affichée sur la sortie standard (uniquement en cas de substitution) | en cas de remplacement la ligne concernée est affichée sur la sortie standard (uniquement en cas de substitution) | ||
Ligne 209: | Ligne 235: | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed "s/toto/TOTO/w resultat" test1.txt</code> | + | sed "s/toto/TOTO/w resultat" test1.txt</code> |
en cas de substitution la ligne en entrée est inscrite dans un fichier ''résultat'' | en cas de substitution la ligne en entrée est inscrite dans un fichier ''résultat'' | ||
- | <code bash> | + | <code user> |
- | $ sed "s/toto/TOTO/w resultat1.txt" test1.txt</code> | + | sed "s/toto/TOTO/w resultat1.txt" test1.txt</code> |
+ | |||
+ | Donne : | ||
<code>TOTO et titi aiment les abricots. | <code>TOTO et titi aiment les abricots. | ||
TOTO préfère les Fraises. | TOTO préfère les Fraises. | ||
Ligne 219: | Ligne 248: | ||
TOTo et TITI sont des chipoteurs du jardin. | TOTo et TITI sont des chipoteurs du jardin. | ||
</code> | </code> | ||
+ | |||
Lecture du fichier résultat1.txt créé : | Lecture du fichier résultat1.txt créé : | ||
- | <code bash> | + | <code user> |
- | $ less resultat1.txt</code> | + | less resultat1.txt</code> |
+ | |||
+ | Donne : | ||
<code> | <code> | ||
TOTO et titi aiment les abricots. | TOTO et titi aiment les abricots. | ||
Ligne 230: | Ligne 262: | ||
La fonction de substitution peut aussi être utilisée avec une **expression régulière**. \\ | La fonction de substitution peut aussi être utilisée avec une **expression régulière**. \\ | ||
- | Voir : [[regexp]] | + | Voir : [[:doc:programmation:shell:regexp]] |
+ | |||
+ | <note tip>Pour que les fichiers traités le soit réellement pensez à utiliser l'option ''-i''. Sinon, rien ne sera réalisé réellement.</note> | ||
=== Exemples : === | === Exemples : === | ||
- | <code bash> | + | <code user> |
- | $ sed -e "s/[Ff]raises/FRAISES/g" test1.txt</code> | + | sed -e "s/[Ff]raises/FRAISES/g" test1.txt</code> |
substitue toutes les chaînes //Fraises// ou //fraises// par ''FRAISES'' | substitue toutes les chaînes //Fraises// ou //fraises// par ''FRAISES'' | ||
Ligne 241: | Ligne 275: | ||
---- | ---- | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed -e "s/^/#/" test1.txt </code> | + | sed -e "s/^/#/" test1.txt </code> |
+ | |||
+ | Donne : | ||
<code>#toto et titi aiment les abricots. | <code>#toto et titi aiment les abricots. | ||
#toto préfère les Fraises. | #toto préfère les Fraises. | ||
#titi les cerises. | #titi les cerises. | ||
#TOTo et TITI sont des chipoteurs du jardin.</code> | #TOTo et TITI sont des chipoteurs du jardin.</code> | ||
+ | |||
Ainsi, nous avons commenté l'ensemble des lignes du fichier test1.txt. | Ainsi, nous avons commenté l'ensemble des lignes du fichier test1.txt. | ||
---- | ---- | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed -e "3s/^/#/" test1.txt</code> | + | sed -e "3s/^/#/" test1.txt</code> |
+ | |||
+ | Donne : | ||
<code>toto et titi aiment les abricots. | <code>toto et titi aiment les abricots. | ||
toto préfère les Fraises. | toto préfère les Fraises. | ||
Ligne 262: | Ligne 301: | ||
---- | ---- | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed -e "/cerises/s/^/#/" test1.txt</code> | + | sed -e "/cerises/s/^/#/" test1.txt</code> |
+ | |||
+ | Donne : | ||
<code>toto et titi aiment les abricots. | <code>toto et titi aiment les abricots. | ||
toto préfère les Fraises. | toto préfère les Fraises. | ||
Ligne 269: | Ligne 310: | ||
TOTo et TITI sont des chipoteurs du jardin. | TOTo et TITI sont des chipoteurs du jardin. | ||
</code> | </code> | ||
+ | |||
Ainsi, nous avons commenté uniquement la ligne du fichier //test1.txt// contenant le motif : **cerises**. | Ainsi, nous avons commenté uniquement la ligne du fichier //test1.txt// contenant le motif : **cerises**. | ||
Ligne 277: | Ligne 319: | ||
**Syntaxe :** \\ | **Syntaxe :** \\ | ||
sed <fichier_programme>d <fichier_a_traiter> | sed <fichier_programme>d <fichier_a_traiter> | ||
+ | |||
+ | <note tip>Pour que les fichiers traités le soit réellement pensez à utiliser l'option ''-i''. Sinon, rien ne sera réalisé réellement.</note> | ||
**Exemple :** | **Exemple :** | ||
- | <code bash> | + | <code user> |
- | $ sed "2,4d" test1.txt</code> | + | sed "2,4d" test1.txt</code> |
Cette commande va supprimer les lignes ''2 à 4'' du <fichier>. | Cette commande va supprimer les lignes ''2 à 4'' du <fichier>. | ||
Ligne 287: | Ligne 332: | ||
On peut utiliser les expressions régulières: | On peut utiliser les expressions régulières: | ||
- | <code bash> | + | <code user> |
- | $ sed "/toto/d" test1.txt</code> | + | sed "/toto/d" test1.txt</code> |
Cette commande __supprime les lignes__ contenant la chaîne ''toto''. | Cette commande __supprime les lignes__ contenant la chaîne ''toto''. | ||
Ligne 296: | Ligne 341: | ||
Si, à l'inverse, __on ne veut pas effacer__ les lignes contenant la chaîne toto (toutes les autres sont supprimées), on tapera: | Si, à l'inverse, __on ne veut pas effacer__ les lignes contenant la chaîne toto (toutes les autres sont supprimées), on tapera: | ||
- | <code bash> | + | <code user> |
- | $ sed "/toto/!d" test1.txt</code> | + | sed "/toto/!d" test1.txt</code> |
==== Les fonctions p, l, et = ==== | ==== Les fonctions p, l, et = ==== | ||
Ligne 309: | Ligne 354: | ||
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). | 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). | ||
- | <code bash> | + | <code user> |
- | $ sed l test1.txt</code> | + | sed l test1.txt</code> |
+ | |||
+ | Donne : | ||
<code> | <code> | ||
toto et titi aiment les abricots.$ | toto et titi aiment les abricots.$ | ||
Ligne 321: | Ligne 368: | ||
La commande "''=''" donne le numéro de la ligne sélectionnée sur la sortie standard. | La commande "''=''" donne le numéro de la ligne sélectionnée sur la sortie standard. | ||
- | <code bash> | + | <code user> |
- | $ sed = test1.txt</code> | + | sed = test1.txt</code> |
+ | |||
+ | Donne : | ||
<code> | <code> | ||
1 | 1 | ||
Ligne 333: | Ligne 382: | ||
TOTo et TITI sont des chipoteurs du jardin.</code> | TOTo et TITI sont des chipoteurs du jardin.</code> | ||
- | <code bash> | + | <code user> |
- | $ sed "/toto/=" test1.txt</code> | + | sed "/toto/=" test1.txt</code> |
+ | |||
+ | Donne : | ||
Cette commande va afficher le numéro des lignes contenant la chaîne ''toto'' ainsi : | Cette commande va afficher le numéro des lignes contenant la chaîne ''toto'' ainsi : | ||
<code> | <code> | ||
Ligne 353: | Ligne 404: | ||
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). | 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). | ||
- | <code bash> | + | <code user> |
- | ~$ sed "/cerises/q" test1.txt </code> | + | sed "/cerises/q" test1.txt </code> |
+ | |||
+ | Donne : | ||
<code> | <code> | ||
toto et titi aiment les abricots. | toto et titi aiment les abricots. | ||
Ligne 364: | Ligne 417: | ||
La fonction "''r''" (read) lit le contenu d'un fichier et écrit le contenu sur la sortie standard. | La fonction "''r''" (read) lit le contenu d'un fichier et écrit le contenu sur la sortie standard. | ||
- | <code bash> | + | <code user> |
- | $ sed r test1.txt </code> | + | sed r test1.txt </code> |
+ | |||
+ | Donne : | ||
<code> | <code> | ||
toto et titi aiment les abricots. | toto et titi aiment les abricots. | ||
Ligne 377: | Ligne 432: | ||
La fonction "''w''" (write) écrit la ligne sélectionnée dans un fichier. \\ | La fonction "''w''" (write) écrit la ligne sélectionnée dans un fichier. \\ | ||
Par exemple : | Par exemple : | ||
- | <code bash> | + | <code user> |
- | $ sed "/^toto/w resultat2.txt" test1.txt</code> | + | sed "/^toto/w resultat2.txt" test1.txt</code> |
Cette commande va écrire dans le fichier ''resultat2.txt'' toutes les lignes du fichier //test1.txt// commençant par la chaîne //toto//. | Cette commande va écrire dans le fichier ''resultat2.txt'' toutes les lignes du fichier //test1.txt// commençant par la chaîne //toto//. | ||
Ligne 391: | Ligne 447: | ||
**Exemple :** \\ | **Exemple :** \\ | ||
- | <code bash> | + | <code user> |
- | $ sed 1i\ Début test1.txt</code> | + | sed 1i\ Début test1.txt</code> |
+ | |||
+ | Donne | ||
<code>Début | <code>Début | ||
toto et titi aiment les abricots. | toto et titi aiment les abricots. | ||
Ligne 408: | Ligne 466: | ||
**Exemple :** \\ | **Exemple :** \\ | ||
- | <code bash> | + | <code user> |
- | $ sed 4a\ Fin test1.txt</code> | + | sed 4a\ Fin test1.txt</code> |
+ | |||
+ | Donne : | ||
<code> | <code> | ||
toto et titi aiment les abricots. | toto et titi aiment les abricots. | ||
Ligne 415: | Ligne 475: | ||
titi les cerises. | titi les cerises. | ||
TOTo et TITI sont des chipoteurs du jardin. | TOTo et TITI sont des chipoteurs du jardin. | ||
- | Fin | + | Fin</code> |
- | </code> | + | |
Vous pouvez appeler la fonction ''i'' ou ''a'' dans un fichier de commande sed. | Vous pouvez appeler la fonction ''i'' ou ''a'' dans un fichier de commande sed. | ||
Ligne 423: | Ligne 482: | ||
Soit un fichier //prog.sed// rédigé ainsi : | Soit un fichier //prog.sed// rédigé ainsi : | ||
- | <code bash> | + | <code user> |
- | $ cat >> ~/test3.txt <<EOF</code> | + | cat >> ~/test3.txt <<EOF |
- | <code> | + | |
1i\\ | 1i\\ | ||
début du traitement | début du traitement | ||
Ligne 436: | Ligne 494: | ||
On exécute la commande en tapant : | On exécute la commande en tapant : | ||
- | <code bash> | + | <code user> |
- | $ sed -f test3.txt test1.txt</code> | + | sed -f test3.txt test1.txt</code> |
+ | |||
+ | Résultat : | ||
<code> | <code> | ||
début du traitement | début du traitement | ||
Ligne 454: | Ligne 514: | ||
de notre fichier. test1.txt | de notre fichier. test1.txt | ||
+ | |||
+ | <note>Pour rendre effective cette commande programmée, écrivez : '' -i '' ainsi : | ||
+ | <code user>sed -i -f test3.txt test1.txt</code></note> | ||
==== sed et les sous-chaînes ==== | ==== sed et les sous-chaînes ==== | ||
La commande: | La commande: | ||
- | |||
sed -e "s/\([0-9][0-9]*\)/aa\1aa/" <fichier> | sed -e "s/\([0-9][0-9]*\)/aa\1aa/" <fichier> | ||
Ligne 470: | Ligne 532: | ||
La commande: | La commande: | ||
- | |||
sed -e 's/motif: .*/motif: nouveau/' <fichier> | sed -e 's/motif: .*/motif: nouveau/' <fichier> | ||
Ligne 476: | Ligne 537: | ||
//Merci à //**cthulu**// Hop !// LOL | //Merci à //**cthulu**// Hop !// LOL | ||
+ | |||
===== Lien : ===== | ===== Lien : ===== | ||