logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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 → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
doc:systeme:sed [20/04/2015 18:23]
milou [sed]
doc:systeme:sed [30/09/2023 22:14] (Version actuelle)
captnfab [Lien :]
Ligne 55: 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 75: Ligne 75:
  
 **Syntaxe :** \\ **Syntaxe :** \\
-   sed -i <programme_sed> <fichier_a_traiter>+   sed -i <commande_sed> <fichier_à_traiter>
  
  
Ligne 81: 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 91: 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 113: 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_programmedans 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 144: 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 162: Ligne 168:
  
 **Syntaxe :** \\ **Syntaxe :** \\
-   sed -n <fichier_programme>/p <fichier_a_traiter>+   sed -n <commande_sed>/p <fichier_à_traiter>
  
 **Exemple :** **Exemple :**
Ligne 186: 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 248: 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 263: 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 273: 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 288: Ligne 294:
 \\ \\
 <code user> <code user>
-sed -e "​s/​^/#/"​ test1.txt </​code>​+sed "​s/​^/#/"​ test1.txt </​code>​
  
 Donne : Donne :
Ligne 301: Ligne 307:
 \\ \\
 <code user> <code user>
-sed -e "​3s/​^/#/"​ test1.txt</​code>​+sed "​3s/​^/#/"​ test1.txt</​code>​
  
 Donne : Donne :
Ligne 314: Ligne 320:
 \\ \\
 <code user> <code user>
-sed -e "/​cerises/​s/​^/#/"​ test1.txt</​code>​+sed "/​cerises/​s/​^/#/"​ test1.txt</​code>​
  
 Donne : Donne :
Ligne 330: 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 380: 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 398: 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 409: 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 459: 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 478: Ligne 482:
  
 **Exemple :** \\ **Exemple :** \\
-<code user> +<code user>sed 4a\ Fin test1.txt</​code>​
-sed 4a\ Fin test1.txt</​code>​+
  
 Donne : Donne :
Ligne 492: 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 506: 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 519: Ligne 520:
 </​code>​ </​code>​
  
-la commande rédigée ​dans le fichier //test3.txt// 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 528: 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 550: 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
doc/systeme/sed.1429546995.txt.gz · Dernière modification: 20/04/2015 18:23 par milou

Pied de page des forums

Propulsé par FluxBB