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 [13/08/2013 18:19] smolski [Préparation aux exemples d'illustration de ce tuto :] |
doc:systeme:sed [08/10/2013 08:42] smolski |
||
---|---|---|---|
Ligne 5: | Ligne 5: | ||
* Commentaires : // sed est un outil éditeur en ligne. // | * Commentaires : // sed est un outil éditeur en ligne. // | ||
* Débutant, à savoir : | * Débutant, à savoir : | ||
- | * [[manuel:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | + | * [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) |
- | * [[manuel:bash]] En complément. | + | * [[:doc:programmation:shell:repertoires | Shell - Les répertoires et chemins]] **INDISPENSABLE** |
+ | * [[:doc:programmation:shell:regexp | REGEXP - Les expressions régulières dans un shell.]] | ||
+ | * [[:doc:programmation:bash | Le shell BASH]] En complément. | ||
===== 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 20: | ||
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 56: | ||
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 65: | ||
</code> | </code> | ||
- | Voir : la commande [[cat]] | + | Voir : [[doc:systeme:cat | la commande cat]] |
==== Option -i ==== | ==== Option -i ==== | ||
Ligne 87: | Ligne 87: | ||
**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 125: | Ligne 129: | ||
**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 139: | Ligne 144: | ||
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 157: | Ligne 164: | ||
**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 175: | Ligne 186: | ||
**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 190: | Ligne 203: | ||
---- | ---- | ||
\\ | \\ | ||
- | <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 202: | Ligne 215: | ||
---- | ---- | ||
\\ | \\ | ||
- | <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 210: | Ligne 223: | ||
\\ | \\ | ||
- | <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 218: | Ligne 231: | ||
\\ | \\ | ||
- | <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 228: | Ligne 244: | ||
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 239: | Ligne 258: | ||
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 250: | Ligne 271: | ||
---- | ---- | ||
\\ | \\ | ||
- | <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 271: | Ligne 297: | ||
---- | ---- | ||
\\ | \\ | ||
- | <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 278: | Ligne 306: | ||
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 286: | Ligne 315: | ||
**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 296: | Ligne 328: | ||
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 305: | Ligne 337: | ||
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 318: | Ligne 350: | ||
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 330: | Ligne 364: | ||
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 342: | Ligne 378: | ||
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 362: | Ligne 400: | ||
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 373: | Ligne 413: | ||
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 386: | Ligne 428: | ||
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 400: | Ligne 443: | ||
**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 417: | Ligne 462: | ||
**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 424: | Ligne 471: | ||
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 432: | Ligne 478: | ||
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 445: | Ligne 490: | ||
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 465: | Ligne 512: | ||
<note>Pour rendre effective cette commande programmée, écrivez : '' -i '' ainsi : | <note>Pour rendre effective cette commande programmée, écrivez : '' -i '' ainsi : | ||
- | <code bash> | + | <code user>sed -i -f test3.txt test1.txt</code></note> |
- | $ 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 483: | Ligne 528: | ||
La commande: | La commande: | ||
- | |||
sed -e 's/motif: .*/motif: nouveau/' <fichier> | sed -e 's/motif: .*/motif: nouveau/' <fichier> | ||
Ligne 489: | Ligne 533: | ||
//Merci à //**cthulu**// Hop !// LOL | //Merci à //**cthulu**// Hop !// LOL | ||
+ | |||
===== Lien : ===== | ===== Lien : ===== | ||