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 [09/07/2010 10:09] smolski |
doc:systeme:sed [09/01/2013 05:48] smolski |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== sed ====== | ||
+ | * Objet : ''sed'' signifie //Stream EDitor//, autrement dit //éditeur de flux// et plus précisément //éditeur de flux orienté ligne//. | ||
+ | * Niveau requis : TOUS | ||
+ | * Commentaires : // sed est un outil éditeur en ligne. // | ||
+ | * Débutant, à savoir : | ||
+ | * [[manuel:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | ||
+ | * [[manuel:bash]] En complément. | ||
+ | |||
+ | ===== 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 [[manuel:vim]] ou [[manuel: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 : | ||
+ | |||
+ | $ man sed | ||
+ | |||
+ | |||
+ | |||
+ | ===== 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, rédigez un fichier test1.txt ainsi : | ||
+ | |||
+ | <code bash> | ||
+ | $ cat >> ~/test1.txt <<EOF</code> | ||
+ | <code> | ||
+ | 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 : la commande [[cat]] | ||
+ | |||
+ | ==== Option -i ==== | ||
+ | |||
+ | <note important>ATTENTION ! L'option -i __modifiera réellement__ les fichiers traités.</note> | ||
+ | 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 <programme_sed> <fichier_a_traiter> | ||
+ | |||
+ | |||
+ | ==== Option -e ==== | ||
+ | '' | ||
+ | -e'' permet de spécifier les commandes à appliquer sur le fichier. \\ | ||
+ | Cette option est utile lorque 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 ''"'' . | ||
+ | |||
+ | **Syntaxe :** \\ | ||
+ | sed -e <programme_sed> <fichier_a_traiter> | ||
+ | |||
+ | **Exemple :** | ||
+ | <code bash> | ||
+ | $ sed -e "s/[Tt][Oo]/ton/g" test1.txt</code> | ||
+ | <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> | ||
+ | |||
+ | **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 fonction d'édition.</note> | ||
+ | |||
+ | ==== 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). | ||
+ | |||
+ | **Syntaxe :** \\ | ||
+ | sed -f <fichier_programme> <fichier_a_traiter> | ||
+ | |||
+ | === Exemple : === | ||
+ | |||
+ | Créer un fichier représentant l'écriture de la commande ''sed'' à envoyer : | ||
+ | <code bash> | ||
+ | $ cat >> ~/test2.txt <<EOF</code> | ||
+ | <code> | ||
+ | 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 la commande rédigée dans le fichier //test2.txt// : | ||
+ | <code bash> | ||
+ | $ sed -f test2.txt test1.txt </code> | ||
+ | <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 <fichier_programme>/p <fichier_a_traiter> | ||
+ | |||
+ | **Exemple :** | ||
+ | <code bash> | ||
+ | $ sed -n s/Fraises/fraises/ test1.txt </code> | ||
+ | Bien que traité, rien n'apparait. | ||
+ | |||
+ | Avec la fonction p : | ||
+ | <code bash> | ||
+ | $ sed -n s/Fraises/fraises/p test1.txt </code> | ||
+ | <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/ <fichier_programme>" <fichier_a_traiter> | ||
+ | |||
+ | === Exemples : === | ||
+ | |||
+ | <code bash> | ||
+ | $ 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 : | ||
+ | <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 bash> | ||
+ | $ 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) | ||
+ | <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 bash> | ||
+ | $ 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) | ||
+ | |||
+ | ---- | ||
+ | \\ | ||
+ | |||
+ | <code bash> | ||
+ | $ 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 bash> | ||
+ | $ 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'' | ||
+ | <code bash> | ||
+ | $ sed "s/toto/TOTO/w resultat1.txt" test1.txt</code> | ||
+ | <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 bash> | ||
+ | $ less resultat1.txt</code> | ||
+ | <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 régulière**. \\ | ||
+ | Voir : [[regexp]] | ||
+ | |||
+ | === Exemples : === | ||
+ | |||
+ | <code bash> | ||
+ | $ sed -e "s/[Ff]raises/FRAISES/g" test1.txt</code> | ||
+ | |||
+ | substitue toutes les chaînes //Fraises// ou //fraises// par ''FRAISES'' | ||
+ | ---- | ||
+ | \\ | ||
+ | <code bash> | ||
+ | $ sed -e "s/^/#/" test1.txt </code> | ||
+ | <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 bash> | ||
+ | $ sed -e "3s/^/#/" test1.txt</code> | ||
+ | <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 bash> | ||
+ | $ sed -e "/cerises/s/^/#/" test1.txt</code> | ||
+ | <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 <fichier_programme>d <fichier_a_traiter> | ||
+ | |||
+ | **Exemple :** | ||
+ | <code bash> | ||
+ | $ 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 bash> | ||
+ | $ 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 bash> | ||
+ | $ 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 bash> | ||
+ | $ sed l test1.txt</code> | ||
+ | <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 bash> | ||
+ | $ sed = test1.txt</code> | ||
+ | <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 bash> | ||
+ | $ sed "/toto/=" test1.txt</code> | ||
+ | Cette commande va afficher le numéro des lignes 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 programmes ''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 bash> | ||
+ | ~$ sed "/cerises/q" test1.txt </code> | ||
+ | <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 bash> | ||
+ | $ sed r test1.txt </code> | ||
+ | <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 bash> | ||
+ | $ 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 bash> | ||
+ | $ sed 1i\ Début test1.txt</code> | ||
+ | <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 bash> | ||
+ | $ sed 4a\ Fin test1.txt</code> | ||
+ | <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 //prog.sed// rédigé ainsi : | ||
+ | |||
+ | <code bash> | ||
+ | $ cat >> ~/test3.txt <<EOF</code> | ||
+ | <code> | ||
+ | 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 bash> | ||
+ | $ sed -f test3.txt test1.txt</code> | ||
+ | <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> | ||
+ | |||
+ | la commande rédigée dans le fichier //test3.txt// a 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 | ||
+ | |||
+ | ==== 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. | ||
+ | |||
+ | ===== Lien : ===== | ||
+ | |||
+ | * http://www.funix.org/fr/unix/expr-sed.htm#haut | ||
+ | * http://www.shellunix.com/sed.html | ||
+ | |||
+ | ===== 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 |