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 | ||
doc:systeme:sed [23/05/2013 18:51] smolski [Préparation aux exemples d'illustration de ce tuto :] |
doc:systeme:sed [30/09/2023 22:14] captnfab [Lien :] |
||
---|---|---|---|
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 avisé}} |
- | * 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 [[user>smolski]] le 24-04-2010 |
+ | * Testé par [[user>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 !)) | ||
===== 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 21: | ||
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 53: | Ligne 55: | ||
===== Préparation aux exemples d'illustration de ce tuto : ===== | ===== Préparation aux exemples d'illustration de ce tuto : ===== | ||
- | 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, créez 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 66: | ||
</code> | </code> | ||
- | Voir : la commande [[cat]] | + | Voir : [[doc:systeme:cat | la commande cat]] |
==== Option -i ==== | ==== Option -i ==== | ||
Ligne 74: | Ligne 75: | ||
**Syntaxe :** \\ | **Syntaxe :** \\ | ||
- | sed -i <programme_sed> <fichier_a_traiter> | + | sed -i <commande_sed> <fichier_à_traiter> |
Ligne 80: | Ligne 81: | ||
'' | '' | ||
-e'' permet de spécifier les commandes à appliquer sur le fichier. \\ | -e'' permet de spécifier les commandes à appliquer sur le fichier. \\ | ||
- | Cette option est utile lorque vous appliquez plusieurs commandes. | + | Cette option est utile lorsque 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 ''"'' . | + | Afin d'éviter que le shell interprète certains caractères, il vaut mieux encadrer la commande avec des apostrophes simples ou doubles : '' ' '' ou ''"'' . |
+ | <note>-e renvoie le résultat sur l'entrée standard(écran), le fichier n'est pas modifié</note> | ||
**Syntaxe :** \\ | **Syntaxe :** \\ | ||
- | sed -e <programme_sed> <fichier_a_traiter> | + | sed -e <commande_sed> -e <commande_sed> <fichier_à_traiter> |
**Exemple :** | **Exemple :** | ||
- | <code bash> | + | |
- | $ sed -e "s/[Tt][Oo]/ton/g" test1.txt</code> | + | La commande : |
- | <code>tonton et titi aiment les abricots. | + | <code user> |
+ | sed -e "s/[Tt][Oo]/ton/g" -e "s/abricots/myrtilles/g" test1.txt</code> | ||
+ | |||
+ | Donne : | ||
+ | <code>tonton et titi aiment les myrtilles. | ||
tonton préfère les Fraises. | tonton préfère les Fraises. | ||
titi les cerises. | titi les cerises. | ||
Ligne 108: | Ligne 114: | ||
sur la //globalité// du fichier, (//c'est à dire toutes les lignes//) ''(/**g**''). | sur la //globalité// du fichier, (//c'est à dire toutes les lignes//) ''(/**g**''). | ||
- | <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 commande à faire exécuter à sed.</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#' | ||
+ | |||
+ | Évitant ainsi des confusions dans l'interprétation de la commande. | ||
+ | |||
+ | //Merci à //**enicar**// sur le chan df !// | ||
+ | |||
+ | Dans la même idée d'interprétation confuse, voir sur le forum : | ||
+ | * https://debian-facile.org/viewtopic.php?pid=342480#p342480 | ||
==== Option -f ==== | ==== Option -f ==== | ||
- | 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). | + | L'option -f permet d'utiliser un fichier texte contenant les commandes que ''sed'' devra appliquer. \\ |
+ | Ce fichier est donc un script qui sera interprété par le programme ''sed'' d'où le nom utilisé dans ce tuto : <script_sed> | ||
**Syntaxe :** \\ | **Syntaxe :** \\ | ||
- | sed -f <fichier_programme> <fichier_a_traiter> | + | sed -f <script_sed> <fichier_à_traiter> |
+ | |||
+ | <note tip>Pour que les fichiers traités le soient 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 ''monScriptSed'' qui contiendra toutes les commandes que ''sed'' devra exécuter : |
- | <code bash> | + | <code user monScriptSed> |
- | $ cat >> ~/test2.txt <<EOF</code> | + | cat >> ~/monScriptSed <<EOF |
- | <code> | + | |
s/[Tt][Oo]/ton/g | s/[Tt][Oo]/ton/g | ||
s/[Tt][Ii]/ti/g | s/[Tt][Ii]/ti/g | ||
Ligne 129: | Ligne 150: | ||
</code> | </code> | ||
- | 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 les commandes contenues dans le fichier //monScriptSed// : |
- | <code bash> | + | <code user> |
- | $ sed -f test2.txt test1.txt </code> | + | sed -f monScriptSed 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 145: | Ligne 168: | ||
**Syntaxe :** \\ | **Syntaxe :** \\ | ||
- | sed -n <fichier_programme>/p <fichier_a_traiter> | + | sed -n <commande_sed>/p <fichier_à_traiter> |
**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 165: | Ligne 192: | ||
**Syntaxe :** | **Syntaxe :** | ||
- | sed <option> "s/ <fichier_programme>" <fichier_a_traiter> | + | sed <option> "s/ <commande_sed>" <fichier_à_traiter> |
+ | |||
+ | <note tip>Pour que les fichiers traités le soient 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 "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 210: | ||
---- | ---- | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed "s/toto/TOTO/2" test1.txt</code> | + | sed "2s/toto/TOTO/" 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 222: | ||
---- | ---- | ||
\\ | \\ | ||
- | <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 230: | ||
\\ | \\ | ||
- | <code bash> | + | Nous pouvons également choisir de ne changer qu'une occurence en la situant dans le texte. \\ |
- | $ sed "s/toto/TOTO/p" test1.txt</code> | + | Dans le fichier exemple ci-dessous : |
+ | <file bash texte_exemple>toto et titi sont sur un bato</file> | ||
+ | |||
+ | La commande : | ||
+ | <code user> | ||
+ | sed -e "s/to/teau/3" texte_exemple</code> | ||
+ | |||
+ | n'agira que sur la //troisième occurence// "to" et affichera la rectification : | ||
+ | <file bash texte_exemple>toto et titi sont sur un bateau</file> | ||
+ | |||
+ | //Cool, non ?// 8-) | ||
+ | |||
+ | ---- | ||
+ | \\ | ||
+ | <code user> | ||
+ | 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 253: | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed "s/toto/TOTO/w resultat" test1.txt</code> | + | sed "s/toto/TOTO/w résultat" 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 résultat1.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 266: | ||
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 résultat1.txt</code> |
+ | |||
+ | Donne : | ||
<code> | <code> | ||
TOTO et titi aiment les abricots. | TOTO et titi aiment les abricots. | ||
Ligne 229: | Ligne 279: | ||
==== sed et les regexp ==== | ==== sed et les regexp ==== | ||
- | 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 rationnelle**. \\ |
- | Voir : [[regexp]] | + | Voir : [[:doc:programmation:shell:regexp]] |
+ | |||
+ | <note tip>Pour que les fichiers traités le soient 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 "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'' | ||
+ | |||
---- | ---- | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed -e "s/^/#/" test1.txt </code> | + | sed "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 "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 257: | Ligne 316: | ||
</code> | </code> | ||
Ainsi, nous avons commenté uniquement la 3ème ligne du fichier //test1.txt//. | Ainsi, nous avons commenté uniquement la 3ème ligne du fichier //test1.txt//. | ||
+ | |||
---- | ---- | ||
\\ | \\ | ||
- | <code bash> | + | <code user> |
- | $ sed -e "/cerises/s/^/#/" test1.txt</code> | + | sed "/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 266: | Ligne 328: | ||
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 273: | Ligne 336: | ||
**Syntaxe :** \\ | **Syntaxe :** \\ | ||
- | sed <fichier_programme>d <fichier_a_traiter> | + | sed <commande_sed>d <fichier_à_traiter> |
+ | |||
+ | <note tip>Pour que les fichiers traités le soient 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 284: | Ligne 350: | ||
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 293: | Ligne 359: | ||
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 306: | Ligne 372: | ||
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 318: | Ligne 386: | ||
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 330: | Ligne 399: | ||
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> |
- | Cette commande va afficher le numéro des lignes contenant la chaîne ''toto'' ainsi : | + | |
+ | Donne : | ||
+ | Cette commande va afficher le numéro de chaque ligne contenant la chaîne ''toto'' ainsi : | ||
<code> | <code> | ||
1 | 1 | ||
Ligne 343: | Ligne 414: | ||
==== Remarque ==== | ==== Remarque ==== | ||
- | <note tip>Ces trois commandes sont utiles pour le débogage, quand vous mettez au point vos programmes ''sed''.</note> | + | <note tip>Ces trois commandes sont utiles pour le débogage, quand vous mettez au point vos commandes ''sed''.</note> |
==== Les fonctions q, r et w ==== | ==== Les fonctions q, r et w ==== | ||
Ligne 350: | Ligne 421: | ||
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 361: | Ligne 434: | ||
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 374: | Ligne 449: | ||
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 388: | Ligne 464: | ||
**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 405: | Ligne 482: | ||
**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 412: | Ligne 490: | ||
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. | ||
**Exemple :** \\ | **Exemple :** \\ | ||
- | Soit un fichier //prog.sed// rédigé ainsi : | + | Soit un fichier //monScriptSed// rédigé ainsi : |
- | <code bash> | + | <code user>cat >> ~/monScriptSed <<EOF |
- | $ cat >> ~/test3.txt <<EOF</code> | + | |
- | <code> | + | |
1i\\ | 1i\\ | ||
début du traitement | début du traitement | ||
Ligne 433: | Ligne 508: | ||
On exécute la commande en tapant : | On exécute la commande en tapant : | ||
- | <code bash> | + | <code user>sed -f monScriptSed test1.txt</code> |
- | $ sed -f test3.txt test1.txt</code> | + | |
+ | Résultat : | ||
<code> | <code> | ||
début du traitement | début du traitement | ||
Ligne 444: | Ligne 520: | ||
</code> | </code> | ||
- | la commande rédigée dans le fichier //test3.txt// a pour effet d'inscrire avant la première ligne (1i) le texte : | + | les commandes rédigées dans le fichier //monScriptSed// ont pour effet d'inscrire avant la première ligne (1i) le texte : |
début de traitement | début de traitement | ||
Ligne 451: | Ligne 527: | ||
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 monScriptSed 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 467: | Ligne 545: | ||
La commande: | La commande: | ||
- | |||
sed -e 's/motif: .*/motif: nouveau/' <fichier> | sed -e 's/motif: .*/motif: nouveau/' <fichier> | ||
Ligne 473: | Ligne 550: | ||
//Merci à //**cthulu**// Hop !// LOL | //Merci à //**cthulu**// Hop !// LOL | ||
+ | |||
+ | ===== Sed et recherche de motif non-gourmande ===== | ||
+ | |||
+ | * Création par [[user>David5647]] 31/08/2020 | ||
+ | * Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?pid=341973#p341973]] | ||
+ | |||
+ | ==== Comportement par défaut ==== | ||
+ | |||
+ | Par défaut, lors de la recherche d'une expression régulière, la correspondance retournée par sed est la plus longue chaîne de caractères possible. | ||
+ | |||
+ | Soit le texte suivant: | ||
+ | <code>Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!</code> | ||
+ | Extraire la première phrase c'est lister tout les caractères jusqu'au premier point, soit l'expression régulière : | ||
+ | <code>.*/.</code> | ||
+ | |||
+ | Mais une telle recherche renvoie la plus longue chaîne possible: | ||
+ | <code user>echo "Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!" | sed -r 's/(.*\.).*/\1/'</code> | ||
+ | <code>Une 1ère phrase. Une deuxième phrase. Une troisième phrase.</code> | ||
+ | |||
+ | ==== Recherche non-gourmande ==== | ||
+ | |||
+ | Pour effectuer une recherche plus restrictive et trouver la plus petite chaîne correspondante, il suffit simplement de rechercher tout les caractères sauf le point. Soit l'expression régulière suivante: | ||
+ | <code>[^.]*\.</code> | ||
+ | On obtient alors : | ||
+ | <code user>echo "Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!" | sed -r 's/([^.]*\.).*/\1/'</code> | ||
+ | <code>Une 1ère phrase.</code> | ||
+ | |||
+ | ==== Aller plus loin ==== | ||
+ | |||
+ | En répétant la motif plusieurs fois, on peut alors extraire toutes les correspondances. Soit l'expression régulière: | ||
+ | <code>([^.]*\.){$i}</code> avec i le nombre de répétitions | ||
+ | |||
+ | Soit dans une boucle: | ||
+ | <code user>for i in 1 2 3; do | ||
+ | echo "Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!" | sed -r "s/([^.]*\.){$i}.*/\1/" ; | ||
+ | done</code> | ||
+ | <code>Une 1ère phrase. | ||
+ | Une deuxième phrase. | ||
+ | Une troisième phrase.</code> | ||
+ | |||
+ | Voilà, c'est bête, mais j'ai cherché longtemps :P | ||
===== Lien : ===== | ===== Lien : ===== | ||
* http://www.funix.org/fr/unix/expr-sed.htm#haut | * http://www.funix.org/fr/unix/expr-sed.htm#haut | ||
* http://www.shellunix.com/sed.html | * http://www.shellunix.com/sed.html | ||
+ | |||
+ | **Voir aussi ssed aux fonctions plus étendues :** | ||
+ | * https://debian-facile.org/utilisateurs:phlinux:tutos:omegat-merge-de-la-source-avec-la-traduction | ||
+ | |||
+ | |||
===== Remerciements ===== | ===== Remerciements ===== | ||
//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**. :-D | //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**. :-D |