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 [21/07/2014 10:10] smolski [Préparation aux exemples d'illustration de ce tuto :] |
doc:systeme:sed [30/09/2023 22:14] (Version actuelle) captnfab [Lien :] |
||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
* Objet : sed | * Objet : sed | ||
- | * Niveau requis : {{tag>débutant}} | + | * Niveau requis : {{tag>débutant avisé}} |
* Commentaires : **sed** signifie //Stream EDitor//, autrement dit //éditeur de flux// et plus précisément //éditeur de flux orienté ligne//. | * Commentaires : **sed** signifie //Stream EDitor//, autrement dit //éditeur de flux// et plus précisément //éditeur de flux orienté ligne//. | ||
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | ||
* Suivi : | * Suivi : | ||
- | * Création par smolski 24-04-2010 | + | * Création par [[user>smolski]] le 24-04-2010 |
- | * Testé par smolski le 08-10-2013 | + | * 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 !)) | * 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 ===== | ||
Ligne 58: | 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 user fichier_test1.txt> | <code user fichier_test1.txt> | ||
Ligne 78: | Ligne 75: | ||
**Syntaxe :** \\ | **Syntaxe :** \\ | ||
- | sed -i <programme_sed> <fichier_a_traiter> | + | sed -i <commande_sed> <fichier_à_traiter> |
Ligne 84: | 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 :** | ||
Ligne 94: | Ligne 92: | ||
La commande : | La commande : | ||
<code user> | <code user> | ||
- | sed -e "s/[Tt][Oo]/ton/g" test1.txt</code> | + | sed -e "s/[Tt][Oo]/ton/g" -e "s/abricots/myrtilles/g" test1.txt</code> |
Donne : | Donne : | ||
- | <code>tonton et titi aiment les abricots. | + | <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 106: | Ligne 104: | ||
"s/[Tt][Oo]/ton/g" | "s/[Tt][Oo]/ton/g" | ||
- | est la ''commande sed'' //substituant// (''**s**/'') les chaînes de caraCool, non ?ctère : | + | est la ''commande sed'' //substituant// (''**s**/'') les chaînes de caractère : |
TOTO | TOTO | ||
TOTo | TOTo | ||
Ligne 116: | 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 === | === 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 : | + | 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#' | sed -e 's#/machin/truc/chouette#/machin/truc/wouap#' | ||
- | Evitant ainsi des confusions dans l'interprétation de la commande. | + | Évitant ainsi des confusions dans l'interprétation de la commande. |
//Merci à //**enicar**// sur le chan df !// | //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 soit réellement pensez à utiliser l'option ''-i''. Sinon, rien ne sera réalisé réellement.</note> | + | <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 user fichier_test2.txt> | + | <code user monScriptSed> |
- | cat >> ~/test2.txt <<EOF | + | cat >> ~/monScriptSed <<EOF |
s/[Tt][Oo]/ton/g | s/[Tt][Oo]/ton/g | ||
s/[Tt][Ii]/ti/g | s/[Tt][Ii]/ti/g | ||
Ligne 147: | 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 user> | <code user> | ||
- | sed -f test2.txt test1.txt </code> | + | sed -f monScriptSed test1.txt </code> |
Donne : | Donne : | ||
Ligne 165: | Ligne 168: | ||
**Syntaxe :** \\ | **Syntaxe :** \\ | ||
- | sed -n <fichier_programme>/p <fichier_a_traiter> | + | sed -n <commande_sed>/p <fichier_à_traiter> |
**Exemple :** | **Exemple :** | ||
Ligne 189: | 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 soit réellement pensez à utiliser l'option ''-i''. Sinon, rien ne sera réalisé réellement.</note> | + | <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 user> | <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 251: | Ligne 254: | ||
<code user> | <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 user> | <code user> | ||
- | sed "s/toto/TOTO/w resultat1.txt" test1.txt</code> | + | sed "s/toto/TOTO/w résultat1.txt" test1.txt</code> |
Donne : | Donne : | ||
Ligne 266: | Ligne 269: | ||
Lecture du fichier résultat1.txt créé : | Lecture du fichier résultat1.txt créé : | ||
<code user> | <code user> | ||
- | less resultat1.txt</code> | + | less résultat1.txt</code> |
Donne : | Donne : | ||
Ligne 276: | 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 : [[:doc:programmation:shell: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> | + | <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 user> | <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'' | ||
Ligne 291: | Ligne 294: | ||
\\ | \\ | ||
<code user> | <code user> | ||
- | sed -e "s/^/#/" test1.txt </code> | + | sed "s/^/#/" test1.txt </code> |
Donne : | Donne : | ||
Ligne 304: | Ligne 307: | ||
\\ | \\ | ||
<code user> | <code user> | ||
- | sed -e "3s/^/#/" test1.txt</code> | + | sed "3s/^/#/" test1.txt</code> |
Donne : | Donne : | ||
Ligne 317: | Ligne 320: | ||
\\ | \\ | ||
<code user> | <code user> | ||
- | sed -e "/cerises/s/^/#/" test1.txt</code> | + | sed "/cerises/s/^/#/" test1.txt</code> |
Donne : | Donne : | ||
Ligne 333: | 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 soit réellement pensez à utiliser l'option ''-i''. Sinon, rien ne sera réalisé réellement.</note> | + | <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 :** | ||
Ligne 383: | 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 user> | + | <code user>sed = test1.txt</code> |
- | sed = test1.txt</code> | + | |
Donne : | Donne : | ||
Ligne 401: | Ligne 403: | ||
Donne : | Donne : | ||
- | Cette commande va afficher le numéro des lignes contenant la chaîne ''toto'' ainsi : | + | Cette commande va afficher le numéro de chaque ligne contenant la chaîne ''toto'' ainsi : |
<code> | <code> | ||
1 | 1 | ||
Ligne 412: | 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 462: | Ligne 464: | ||
**Exemple :** \\ | **Exemple :** \\ | ||
- | <code user> | + | <code user>sed 1i\ Début test1.txt</code> |
- | sed 1i\ Début test1.txt</code> | + | |
Donne | Donne | ||
Ligne 481: | Ligne 482: | ||
**Exemple :** \\ | **Exemple :** \\ | ||
- | <code user> | + | <code user>sed 4a\ Fin test1.txt</code> |
- | sed 4a\ Fin test1.txt</code> | + | |
Donne : | Donne : | ||
Ligne 495: | Ligne 495: | ||
**Exemple :** \\ | **Exemple :** \\ | ||
- | Soit un fichier //prog.sed// rédigé ainsi : | + | Soit un fichier //monScriptSed// rédigé ainsi : |
- | <code user> | + | <code user>cat >> ~/monScriptSed <<EOF |
- | cat >> ~/test3.txt <<EOF | + | |
1i\\ | 1i\\ | ||
début du traitement | début du traitement | ||
Ligne 509: | Ligne 508: | ||
On exécute la commande en tapant : | On exécute la commande en tapant : | ||
- | <code user> | + | <code user>sed -f monScriptSed test1.txt</code> |
- | sed -f test3.txt test1.txt</code> | + | |
Résultat : | Résultat : | ||
Ligne 522: | 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 531: | Ligne 529: | ||
<note>Pour rendre effective cette commande programmée, écrivez : '' -i '' ainsi : | <note>Pour rendre effective cette commande programmée, écrivez : '' -i '' ainsi : | ||
- | <code user>sed -i -f test3.txt test1.txt</code></note> | + | <code user>sed -i -f monScriptSed test1.txt</code></note> |
==== sed et les sous-chaînes ==== | ==== sed et les sous-chaînes ==== | ||
Ligne 553: | Ligne 551: | ||
//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 |