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
Prochaine révision Les deux révisions suivantes
doc:systeme:sed [19/07/2010 17:45]
smolski
doc:systeme:sed [07/09/2016 18:46]
MicP [Préparation aux exemples d'illustration de ce tuto :] divers
Ligne 1: Ligne 1:
 +====== sed ======
  
 +  * Objet : sed
 +  * 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//.
 +  * Débutant, à savoir : [[:​doc:​systeme:​commandes:​le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)
 +  * Suivi : 
 +    * 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 =====
 +
 +''​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 [[:​doc:​editeurs:​vim:​vim]] ou [[:​doc:​editeurs:​nano]] par exemple) ;
 +  - leur applique un certain nombre de commandes d'​édition ;
 +  - et renvoie les lignes résultantes sur la sortie standard, __sans modification__ du fichier traité.
 +
 +''​sed''​ est une évolution de l'​éditeur **ed** lui-même précurseur de **vi**, la syntaxe n'est franchement pas très conviviale, mais il permet de réaliser des commandes complexes sur de gros fichiers.
 +
 +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>​
 +
 +
 +
 +===== Syntaxe =====
 +
 +La syntaxe de sed est la suivante:
 +
 +   sed <​option>​ <​commande ou programme sed> <​fichier_a_traiter>​
 +
 +===== Tableau des principales options sed =====
 +
 +^Option ​  ​^ ​  ​Commentaires ​  |
 +|-n    |Écrit seulement les lignes spécifiées (associé à l'​option /p) sur la sortie standard ​  |
 +|-e    |Ajoute une commande à la liste des commandes que doit exécuter **sed** sur le fichier. ​  |
 +|-f    |Les commandes sont lues à partir d'un fichier préalablement rédigé. ​  |
 +|-i    |Le fichier est édité sur place. ​ Sinon, __//le fichier n'est pas édité//​__,​ une copie de son contenu est éditée et renvoyée sur la sortie standard. ​  |
 +|s/ (//​Substitution//​) ​  ​|Commande de substitution (remplace les caractères définis par l'​ensemble de la commande sed).   |
 +|/g (//​Global//​) ​  ​|Traite toutes les occurences définie (par défaut : seule la première occurence définie est traitée). ​  |
 +|/p (//​Print//​) ​  ​|Imprime (affiche) la ligne traitée (utile avec l'​option -n)   |
 +|/w <​fichier> ​  ​|Écrit la ligne dans le <​fichier>​ specifié en plus de la sortie standard. ​  |
 +|! (//point d'​exclamation :// "​!"​ )   ​|Commande de négation (inversion des caractéristiques de la commande sed)   |
 +|d (//​Delete//​) ​  ​|Efface les lignes (au niveau de la sortie, le fichier d'​origine n'est pas modifié) ​  |
 +|a\<​texte> ​  ​|Écrit le <​texte>​ après la ligne    |
 +|i\<​texte> ​  ​|Écrit le <​texte>​ avant la ligne   |
 +|q (//​Quit//​) ​  ​|Quitte la commande sed   |
 +|= (//signe égal// : = )   ​|Indique le numéro des lignes traitées ​  |
 +|//num// (//Un chiffre//​) ​  ​|Indique le numéro de la ligne à traiter ou bien le numéro d'​ordre de l'​occurence à traiter ​  |
 +|$   ​|Indique la dernière ligne du fichier traité ​  |
 +|\t   ​|Indique une tabulation ​  |
 +
 +
 +===== Préparation aux exemples d'​illustration de ce tuto : =====
 +
 +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>​
 +cat >> ~/test1.txt <<EOF
 +toto et titi aiment les abricots.
 +toto préfère les Fraises.
 +titi les cerises.
 +TOTo et TITI sont des chipoteurs du jardin.
 +EOF
 +</​code>​
 +
 +Voir : [[doc:​systeme:​cat | la commande cat]]
 +
 +==== Option -i ====
 +
 +**ATTENTION !** L'​option -i __modifiera réellement__ les fichiers traités.
 +
 +L'​option ''​-i''​ est la fonction d'​écriture de SED. Si elle n'est pas spécifiée,​ le fichier traité ne sera pas modifié.
 +
 +**Syntaxe :** \\
 +   sed -i <​commande_sed>​ <​fichier_à_traiter>​
 +
 +
 +==== Option -e ====
 +''​
 +-e''​ permet de spécifier les commandes à appliquer sur le fichier. \\
 +Cette option est utile lorsque vous appliquez plusieurs commandes. \\
 +Afin d'​éviter que le shell interprète certains caractères,​ il vaut mieux encadrer la commande avec des apostrophes simples ou doubles : ''​ ' ''​ ou ''"''​ .
 +
 +**Syntaxe :** \\
 +   sed -e <​commande_sed>​ -e <​commande_sed>​ <​fichier_à_traiter>​
 +
 +**Exemple :**
 +
 +La commande :
 +<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.
 +titi les cerises.
 +tonton et TITI sont des chipoteurs du jardin.
 +</​code>​
 +
 +**Où :**
 +   "​s/​[Tt][Oo]/​ton/​g"​
 +
 +est la ''​commande sed''​ //​substituant//​ (''​**s**/''​) les chaînes de caractère :
 +   TOTO
 +   TOTo
 +   toto
 +
 +en :
 +   ​tonton
 +
 +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 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 !//
 +
 +==== Option -f ====
 +
 +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 :** \\
 +   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 : ===
 +
 +Créer un fichier ''​monScriptSed''​ qui contiendra toutes les commandes que ''​sed''​ devra exécuter :
 +<code user monScriptSed>​
 +cat >> ~/​monScriptSed <<EOF
 +s/​[Tt][Oo]/​ton/​g
 +s/​[Tt][Ii]/​ti/​g
 +s/​Fraises/​fraises/​
 +EOF
 +</​code>​
 +
 +Application de la commande ''​sed''​ avec l'​option ''​-f''​ invitant à appliquer les commandes contenues dans le fichier //​monScriptSed//​ :
 +<code user>
 +sed -f monScriptSed test1.txt </​code>​
 +
 +Donne :
 +<​code>​tonton et titi aiment les abricots.
 +tonton préfère les fraises.
 +titi les cerises.
 +tonton et titi sont des chipoteurs du jardin.
 +</​code>​
 +
 +==== Option -n ====
 +
 +Vous disposez de l'​option "''​-n''"​ qui supprime la sortie standard par défaut. \\
 +**sed** va écrire __uniquement les lignes concernées__ par le traitement (sinon il écrit tout, __même les lignes non traitées__). \\
 +Utile avec l'​option "''​p''​ " qui permettra elle de visualiser le traitement du fichier.
 +
 +**Syntaxe :** \\
 +   sed -n <​commande_sed>/​p <​fichier_à_traiter>​
 +
 +**Exemple :**
 +<code user>
 +sed -n s/​Fraises/​fraises/​ test1.txt </​code>​
 +
 +Bien que traité, rien n'​apparait.
 +
 +Avec la fonction p :
 +<code user>
 +sed -n s/​Fraises/​fraises/​p test1.txt </​code>​
 +
 +Donne :
 +<​code>​
 +toto préfère les fraises.
 +</​code>​
 +
 +Seule la ligne traitée est affichée. :-)
 +
 +==== La fonction de substitution s ====
 +
 +La fonction de substitution "''​s''"​ permet de changer la première ou toutes les occurences d'une chaîne par une autre. ​
 +
 +**Syntaxe :**
 +   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 : ===
 +
 +<code user>
 +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 :
 +<code texte>
 +TOTO et titi aiment les abricots.
 +toto préfère les Fraises.
 +titi les cerises.
 +TOTo et TITI sont des chipoteurs du jardin.</​code>​
 +
 +----
 +\\
 +<code user>
 +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)
 +<code texte>
 +toto et titi aiment les abricots.
 +TOTO préfère les Fraises.
 +titi les cerises.
 +TOTo et TITI sont des chipoteurs du jardin.</​code>​
 +
 +----
 +\\
 +<code user>
 +sed "​s/​toto/​TOTO/​g"​ test1.txt</​code>​
 +''​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)
 +
 +----
 +\\
 +
 +Nous pouvons également choisir de ne changer qu'une occurence en la situant dans le texte. \\
 +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)
 +
 +----
 +\\
 +
 +<code user>
 +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''​
 +<code user>
 +sed "​s/​toto/​TOTO/​w résultat1.txt"​ test1.txt</​code>​
 +
 +Donne :
 +<​code>​TOTO et titi aiment les abricots.
 +TOTO préfère les Fraises.
 +titi les cerises.
 +TOTo et TITI sont des chipoteurs du jardin.
 +</​code>​
 +
 +Lecture du fichier résultat1.txt créé :
 +<code user>
 +less résultat1.txt</​code>​
 +
 +Donne :
 +<​code>​
 +TOTO et titi aiment les abricots.
 +TOTO préfère les Fraises.
 +</​code>​
 +
 +==== sed et les regexp ====
 +
 +La fonction de substitution peut aussi être utilisée avec une **expression rationnelle**. \\
 +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 : ===
 +
 +<code user>
 +sed "​s/​[Ff]raises/​FRAISES/​g"​ test1.txt</​code>​
 +
 +substitue toutes les chaînes //Fraises// ou //fraises// par ''​FRAISES''​
 +
 +----
 +\\
 +<code user>
 +sed "​s/​^/#/"​ test1.txt </​code>​
 +
 +Donne :
 +<​code>#​toto et titi aiment les abricots.
 +#toto préfère les Fraises.
 +#titi les cerises.
 +#TOTo et TITI sont des chipoteurs du jardin.</​code>​
 +
 +Ainsi, nous avons commenté l'​ensemble des lignes du fichier test1.txt.
 +
 +----
 +\\
 +<code user>
 +sed "​3s/​^/#/"​ test1.txt</​code>​
 +
 +Donne :
 +<​code>​toto et titi aiment les abricots.
 +toto préfère les Fraises.
 +#titi les cerises.
 +TOTo et TITI sont des chipoteurs du jardin.
 +</​code>​
 +Ainsi, nous avons commenté uniquement la 3ème ligne du fichier //​test1.txt//​.
 +
 +----
 +\\
 +<code user>
 +sed "/​cerises/​s/​^/#/"​ test1.txt</​code>​
 +
 +Donne :
 +<​code>​toto et titi aiment les abricots.
 +toto préfère les Fraises.
 +#titi les cerises.
 +TOTo et TITI sont des chipoteurs du jardin.
 +</​code>​
 +
 +Ainsi, nous avons commenté uniquement la ligne du fichier //​test1.txt//​ contenant le motif : **cerises**.
 +
 +==== La fonction de suppression d ====
 +
 +La fonction de suppression ''​d''​ supprime les lignes comprises dans un intervalle donné.
 +
 +**Syntaxe :** \\
 +   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 :**
 +<code user>
 +sed "​2,​4d"​ test1.txt</​code>​
 +
 +Cette commande va supprimer les lignes ''​2 à 4''​ du <​fichier>​.
 +
 +----
 +\\
 +
 +On peut utiliser les expressions régulières:​
 +<code user>
 +sed "/​toto/​d"​ test1.txt</​code>​
 +
 +Cette commande __supprime les lignes__ contenant la chaîne ''​toto''​.
 +
 +----
 +\\
 +
 +Si, à l'​inverse,​ __on ne veut pas effacer__ les lignes contenant la chaîne toto (toutes les autres sont supprimées),​ on tapera:
 +<code user>
 +sed "/​toto/​!d"​ test1.txt</​code>​
 +
 +==== Les fonctions p, l, et = ====
 +
 +=== La commande p ===
 +
 +La commande "''​p''"​ (print) affiche la ligne sélectionnée sur la sortie standard. Elle invalide l'​option "''​-n''"​. \\
 +//Voir option **n** précédente.//​
 +
 +=== La commande l (la lettre L en minuscule) ===
 +
 +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 user>
 +sed l test1.txt</​code>​
 +
 +Donne :
 +<​code>​
 +toto et titi aiment les abricots.$
 +toto et titi aiment les abricots.
 +toto pr\303\251f\303\250re les Fraises.$
 +toto préfère les Fraises.
 +titi les cerises.$</​code>​
 +
 +=== La commande = ===
 +
 +La commande "''​=''"​ donne le numéro de la ligne sélectionnée sur la sortie standard.
 +<code user>sed = test1.txt</​code>​
 +
 +Donne :
 +<​code>​
 +1
 +toto et titi aiment les abricots.
 +2
 +toto préfère les Fraises.
 +3
 +titi les cerises.
 +4
 +TOTo et TITI sont des chipoteurs du jardin.</​code>​
 +
 +<code user>
 +sed "/​toto/​="​ test1.txt</​code>​
 +
 +Donne :
 +Cette commande va afficher le numéro de chaque ligne contenant la chaîne ''​toto''​ ainsi :
 +<​code>​
 +1
 +toto et titi aiment les abricots.
 +2
 +toto préfère les Fraises.
 +titi les cerises.
 +TOTo et TITI sont des chipoteurs du jardin.</​code>​
 +
 +==== Remarque ====
 +
 +<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 ====
 +
 +=== La fonction q ===
 +
 +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 user>
 +sed "/​cerises/​q"​ test1.txt </​code>​
 +
 +Donne :
 +<​code>​
 +toto et titi aiment les abricots.
 +toto préfère les Fraises.
 +titi les cerises.
 +</​code>​
 +
 +=== La fonction r ===
 +
 +La fonction "''​r''"​ (read) lit le contenu d'un fichier et écrit le contenu sur la sortie standard.
 +<code user>
 +sed r test1.txt </​code>​
 +
 +Donne :
 +<​code>​
 +toto et titi aiment les abricots.
 +toto préfère les Fraises.
 +titi les cerises.
 +TOTo et TITI sont des chipoteurs du jardin.
 +</​code>​
 +
 +=== La fonction w <​fichier>​ ===
 +
 +La fonction "''​w''"​ (write) écrit la ligne sélectionnée dans un fichier. \\
 +Par exemple :
 +<code user>
 +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//.
 +
 +==== Les fonctions a et i ====
 +
 +=== La fonction i ===
 +
 +La fonction "''​i''"​ (insert) va placer un texte __avant la ligne sélectionnée__. \\
 +
 +**Syntaxe :**
 +   i\le texte
 +
 +**Exemple :** \\
 +<code user>sed 1i\ Début test1.txt</​code>​
 +
 +Donne
 +<​code>​Début
 +toto et titi aiment les abricots.
 +toto préfère les Fraises.
 +titi les cerises.
 +TOTo et TITI sont des chipoteurs du jardin.
 +</​code>​
 +
 +=== La fonction a ===
 +
 +La fonction "''​a''"​ (append) va placer un texte __après la ligne sélectionnée__. \\ 
 +
 +**Syntaxe :**
 +   a\le texte
 +
 +**Exemple :** \\
 +<code user>sed 4a\ Fin test1.txt</​code>​
 +
 +Donne :
 +<​code>​
 +toto et titi aiment les abricots.
 +toto préfère les Fraises.
 +titi les cerises.
 +TOTo et TITI sont des chipoteurs du jardin.
 +Fin</​code>​
 +
 +Vous pouvez appeler la fonction ''​i''​ ou ''​a''​ dans un fichier de commande sed.
 +
 +**Exemple :** \\
 +Soit un fichier //​monScriptSed//​ rédigé ainsi :
 +
 +<code user>cat >> ~/​monScriptSed <<EOF
 +1i\\ 
 +début du traitement
 +s/​[Tt][Oo]/​ton/​g
 +s/​Fraises/​fraises/​
 +\$a  \\ 
 +fin du traitement\\ ​
 +EOF
 +</​code>​
 +
 +On exécute la commande en tapant :
 +<code user>sed -f monScriptSed test1.txt</​code>​
 +
 +Résultat :
 +<​code>​
 +début du traitement
 +tonton et titi aiment les abricots.
 +tonton préfère les fraises.
 +titi les cerises.
 +tonton et TITI sont des chipoteurs du jardin.
 +fin du traitement
 +</​code>​
 +
 +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
 +
 +et après la dernière ligne ($a) le texte :
 +   fin du traitement
 +
 +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 ====
 +
 +La commande:
 +   sed -e "​s/​\([0-9][0-9]*\)/​aa\1aa/"​ <​fichier>​
 +
 +La sous-expression (sous-chaîne) \([0-9][0-9]*\) désigne un ou plusieurs chiffres, chacun sera entouré des caractères aa. \\
 +La chaîne :
 +   to2to
 +deviendra :
 +   ​toaa2aato.
 +
 +==== sed et le point ====
 +
 +La commande:
 +   sed -e '​s/​motif:​ .*/motif: nouveau/'​ <​fichier>​
 +
 +Remplacera **motif:** par **motif: nouveau** dans le <​fichier>​
 +
 +//Merci à //​**cthulu**//​ Hop !// LOL
 +
 +===== Lien : =====
 +
 +  * http://​www.funix.org/​fr/​unix/​expr-sed.htm#​haut
 +  * 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 =====
 +
 +//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.txt · Dernière modification: 30/09/2023 22:14 par captnfab

Pied de page des forums

Propulsé par FluxBB