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 | ||
utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste [27/07/2014 16:27] Hypathie [La commande s] |
utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste [28/07/2014 12:41] Hypathie [La commande s] |
||
---|---|---|---|
Ligne 45: | Ligne 45: | ||
<code> | <code> | ||
- | [options] /adressage/cmd_de_sed [options_cmd_de_sed] | + | sed [-n [-e commande] [-f script] [-i[.extension]]\ |
+ | [l [cesure]] rsu] [<commande>] [<fichier(s)>] | ||
</code> | </code> | ||
- | |||
- | //Ce que j'appelle là "options_cmd_de_sed" est appelé selon la documentation "drapeaux", ou encore "options". Elle dépend de la connaissance des commandes de sed.// | ||
-> La compréhension de la documentation et le fonctionnement global de sed sont facilités lorsque l'on maîtrise un double rapport d'implications :\\ | -> La compréhension de la documentation et le fonctionnement global de sed sont facilités lorsque l'on maîtrise un double rapport d'implications :\\ | ||
Ligne 485: | Ligne 484: | ||
====Méthodes d'appel==== | ====Méthodes d'appel==== | ||
<code> | <code> | ||
- | s/motif/substitut/[indicateur] fichier | + | s/motif/substitut/[options_de_s] fichier |
</code> | </code> | ||
ou | ou | ||
<code> | <code> | ||
- | cmd | s/motif/substitut/[indicateur] | + | cmd | s/motif/substitut/[options_de_s] |
</code> | </code> | ||
Ligne 507: | Ligne 506: | ||
====Détail : la ligne de commande "s"==== | ====Détail : la ligne de commande "s"==== | ||
<code c> | <code c> | ||
- | s/expression1/expression2/[indicateur] | + | s/expression1/expression2/[options_de_s] |
</code> | </code> | ||
===les séparateurs ( / )=== | ===les séparateurs ( / )=== | ||
Ligne 543: | Ligne 542: | ||
- | ===Les indicateurs=== | + | ====Détail : "options-de-s" ("flags")==== |
^ ^ ^ | ^ ^ ^ | ||
|g | global : toutes les occurrences | | |g | global : toutes les occurrences | | ||
- | |\n| indicateur de sous-chaîne| | + | |n | la nième occurrence d'une ligne | |
- | |w | écrire les modifications effectuées dans un fichier | | + | |
|p | afficher la ligne modifiée | | |p | afficher la ligne modifiée | | ||
+ | |w | écrire les substitutions effectuées dans un fichier | | ||
|e | exécution d'une commande | | |e | exécution d'une commande | | ||
+ | |I | ignorer la casse | | ||
+ | |M | correspondance de E.R.\\ (implémentation GNU, non portable) | | ||
- | ===Les indicateurs spéciaux=== | + | ===g ; n et p === |
+ | * substituer toutes les occurrences de motif | ||
+ | <code text sed-coincoin.txt> | ||
+ | coin | ||
+ | coin | ||
+ | foobar | ||
+ | barbar | ||
+ | coincoin babar coincoin | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | sed 's/coincoin//g' sed-coincoin.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | coin | ||
+ | coin | ||
+ | foobar | ||
+ | barbar | ||
+ | babar | ||
+ | </code> | ||
+ | > Sans ''g'', seul le "coincoin" à gauche de "babar" aurait été substitué par un espace. | ||
+ | |||
+ | * Substituer l'occurrence d'une ligne | ||
+ | |||
+ | <code user> | ||
+ | sed '/babar/s/coin//3' sed-coincoin.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | coin | ||
+ | coin | ||
+ | foobar | ||
+ | barbar | ||
+ | coincoin babar coin | ||
+ | </code> | ||
+ | |||
+ | * Afficher sur la sortie standard la substitution : | ||
+ | <code user> | ||
+ | var="ligne1\nligne2\nligne3\nligne\nligne5" | ||
+ | </code> | ||
+ | <code user> | ||
+ | echo -e "$var" | sed '4 s/e/e4/p' | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | ligne1 | ||
+ | ligne2 | ||
+ | ligne3 | ||
+ | ligne4 | ||
+ | ligne4 | ||
+ | ligne5 | ||
+ | </code> | ||
+ | |||
+ | > Le doublon est dû à l'affichage du cache, auquel s'ajoute l'affichage de la substitution. | ||
+ | > Il faut utiliser l'option sed -n : | ||
+ | |||
+ | <code user>echo -e "$var" | sed -n '4 s/e/e4/p'</code> | ||
+ | |||
+ | ligne4 | ||
+ | |||
+ | === w écrire=== | ||
+ | <code user> | ||
+ | sed -n 's/barbar/babar/pw fichier-barbar' sed-coincoin.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | babar | ||
+ | </code> | ||
+ | <code user> | ||
+ | cat fichier-barbar | ||
+ | </code> | ||
+ | <code> | ||
+ | babar | ||
+ | </code> | ||
+ | |||
+ | === e : exécution d'une commande=== | ||
+ | <code user> | ||
+ | sed 's/barbar/date/e' sed-coincoin.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | coin | ||
+ | coin | ||
+ | foobar | ||
+ | lundi 28 juillet 2014, 12:32:20 (UTC+0200) | ||
+ | coincoin babar coincoin | ||
+ | </code> | ||
+ | |||
+ | ===I : ignorer la casse === | ||
+ | <code user> | ||
+ | var="COINcoin\nbabar\ncoinCOIN\nbabar\ncoincoin" | ||
+ | </code> | ||
+ | <code user> | ||
+ | echo -e "$var" | sed 's/coincoin/tointoin/Ig' | ||
+ | </code> | ||
+ | <code> | ||
+ | tointoin | ||
+ | babar | ||
+ | tointoin | ||
+ | babar | ||
+ | tointoin | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ====Les indicateurs spéciaux==== | ||
^ ^ ^ | ^ ^ ^ | ||
|&|chaîne à remplacer| | |&|chaîne à remplacer| | ||
Ligne 809: | Ligne 911: | ||
</code> | </code> | ||
- | =====sed : commande d'adressage et script avancé===== | + | =====Commandes indiquant en elle-même un adressage sed===== |
+ | |||
+ | ==== # : Commentaire (Aucune adresse autorisée)==== | ||
+ | Le caractère ''#'' (dièse) commence un commentaire et ce jusqu'à la fin de la ligne.\\ | ||
+ | Dans un script sed, il peut se trouver sur la même ligne qu'une commande, elle ne sera prise pour un commantaire.\\ | ||
+ | Si les deux premiers caractères d'un script sed sont "#n", l'option "-n" (no-autoprint) est alors forcée. | ||
+ | |||
+ | ====q quit : Quitter (une adresse autorisée)==== | ||
+ | Cette commande permet de quitter sed après le travail sur l'adressage en cours d'exécution.\\ | ||
+ | Elle est utile quand on utilise sed sur de gros fichiers.\\ | ||
+ | |||
+ | ===Exemple sans commande "q"=== | ||
+ | reprise du "sed-automn.txt" et script1 contenant : | ||
+ | <code> | ||
+ | 4,5p | ||
+ | 8!d | ||
+ | </code> | ||
+ | <code user> | ||
+ | sed -f script1 sed-automn.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | mon bel automne | ||
+ | dans les vergers | ||
+ | de tes yeux planent | ||
+ | </code> | ||
+ | |||
+ | > Dans ce cas, sed affiche de la ligne 4 à la ligne 5. | ||
+ | > Puis la commande d supprime tout sauf les lignes de p et la ligne traitée par d. | ||
+ | |||
+ | ===Utilisation de la commande ''q''=== | ||
+ | Reprise du fichier "sed-automn.txt" et script2 contenant : | ||
+ | <code> | ||
+ | # 4,5p | ||
+ | # 8!d | ||
+ | |||
+ | 6q;4,5p;8!d | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | sed -nf script2 sed-automn.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | mon bel automne | ||
+ | dans les vergers | ||
+ | </code> | ||
+ | |||
+ | > Dans ce cas, la commande q adresse les 6 premières lignes dans la mémoire principale de sed, qui peut alors les utiliser une fois, donc pour une seule commande après q. | ||
+ | > En effet, si l'adressage de la commande suivante "déborde" de celui de la commande q, alors sed affiche la ligne que la commande q a adressé à la mémoire principale. | ||
+ | |||
+ | <code> | ||
+ | sed '2q;4,5p' sed-automn.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | Ton sentiment comme atmosphère | ||
+ | #la deuxième ligne est une ligne vide | ||
+ | </code> | ||
+ | |||
+ | > Utiliser sans adressage elle affiche la première ligne du fichier ; sed enregistre au moins une ligne pour traiter une commande sans adressage du fichier. | ||
+ | |||
+ | ====la commande n (next-line ) ==== | ||
+ | À ne pas confondre avec l'option de la ligne de commande sed.\\ | ||
+ | La commande ''n'' déplace l'adressage de l'espace de travail d'une ligne. | ||
+ | |||
+ | ===Affichage de lignes sans la commande n === | ||
+ | <code user> | ||
+ | echo -e "1A\n2B\n3C" | sed -ne '2p' | ||
+ | </code> | ||
+ | <code> | ||
+ | 2B | ||
+ | </code> | ||
+ | |||
+ | === Affichage de lignes avec la commande n=== | ||
+ | * adressage simple : | ||
+ | <code user> | ||
+ | echo -e "1A\n2B\n3C" | sed -n '2 {n;p}' | ||
+ | </code> | ||
+ | <code> | ||
+ | 3C | ||
+ | </code> | ||
+ | |||
+ | * adressage double : | ||
+ | <code user> | ||
+ | echo -e "1A\n2B\n3C\n3D" | sed -n '1,3 {n;p}' | ||
+ | </code> | ||
+ | <code> | ||
+ | 2B | ||
+ | 3D | ||
+ | </code> | ||
+ | |||
+ | ====la commande { } ==== | ||
+ | Elle permet d'indiquer un seul adressage pour plusieurs commandes.\\ | ||
+ | |||
+ | * Elle s'utilise en ligne de commande voir l'exemple de la commande précédemment considérée ; | ||
+ | |||
+ | sed [options] '/adressage/ {cmd1;cmd2;...}' | ||
+ | |||
+ | * Elle s'utilise aussi dans un script sed ; | ||
+ | <code> | ||
+ | adressage{ | ||
+ | cmd1 | ||
+ | cmd2 | ||
+ | ... | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | * Elle permet l'imbrication d'adressage ; | ||
+ | <code> | ||
+ | adressage1{ | ||
+ | adressage1A cmd1A | ||
+ | adressage1B cmd1B | ||
+ | ... | ||
+ | adressage2{ | ||
+ | cmd2A cmd2A | ||
+ | ... | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ====La commande r "fichier lu" (read) ==== | ||
+ | Elle adresse à sed un fichier et l'insère dans le fichier de destination. | ||
+ | |||
+ | sed '/adressage-pour fichier-modifié/ r fichier-mofifié | ||
+ | |||
+ | Il ne doit y avoir qu'un seul espace entre la commande et le nom du "fichier lu".\\ | ||
+ | Il faut donner le chemin absolu du "fichier lu" | ||
+ | si le terminal ne se trouve dans le répertoire parent de ce "fichier lu". | ||
+ | ===Préparation=== | ||
+ | * soit le fichier "sed-fich-lu.txt" : | ||
+ | <code> | ||
+ | texte du fichier lu | ||
+ | deuxième ligne | ||
+ | </code> | ||
+ | * soit le fichier "sed-coincoin.txt" : | ||
+ | <code> | ||
+ | coin | ||
+ | coin | ||
+ | foobar | ||
+ | barbar | ||
+ | </code> | ||
+ | |||
+ | ===Ajouter le contenu de "sed-fich-lu.txt" dans "sed-coincoin.txt"=== | ||
+ | <code user> | ||
+ | sed '1,3r sed-fich-lu.txt' sed-coincoin.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | coin | ||
+ | texte du fichier lu | ||
+ | deuxième ligne fichier lu | ||
+ | coin | ||
+ | texte du fichier lu | ||
+ | deuxième ligne fichier lu | ||
+ | foobar | ||
+ | texte du fichier lu | ||
+ | deuxième ligne fichier lu | ||
+ | barbar | ||
+ | </code> | ||
+ | |||
+ | ====La commande w fichier ( write ) ==== | ||
+ | Écrit la ligne en cours de traitement dans le fichier spécifié à la suite de la commande "w".\\ | ||
+ | Le fichier sera créé, même si le traitement est nul en sortie.\\ | ||
+ | Tout comme la commande "r" (lecture), il ne doit y avoir qu'un seul espace entre la commande et le nom du fichier à créer.\\ | ||
+ | Si un fichier du même nom existe déjà, il sera écrasé sans avertissement ni confirmation et ce à chaque invocation du script.\\ | ||
+ | Si plusieurs instructions de la commande "w" sont appelées à écrire dans un même fichier depuis un script, chaque écriture est ajoutée à la fin du fichier. | ||
+ | |||
+ | ====Exemples==== | ||
+ | |||
+ | ===créer un fichier avec sed et echo :=== | ||
+ | <code user> | ||
+ | echo "contenu d'un fichier créé" | sed 'w fichier-sed-cree' | ||
+ | </code> | ||
+ | <code> | ||
+ | contenu d'un fichier créé | ||
+ | </code> | ||
+ | |||
+ | ---------- | ||
+ | <note tip> | ||
+ | **Toutes commandes présentées jusqu'ici,**\\ | ||
+ | [[utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste#les-commandes-de-sed-supportant-les-adressages-universaux|celles regroupées en fonction des adressages universaux]],\\ | ||
+ | [[utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste#la-commande-s|la commande ''s'']],\\ | ||
+ | et [[utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste#commandes-indiquant-en-elle-meme-un-adressage-sed|les commandes adressant en-elle-même un adressage à sed]],\\ | ||
+ | utilisent principalement le mécanisme suivant :\\ | ||
+ | |||
+ | > Lecture d'une ligne du fichier d'entrée dans l'espace de travail à laquelle est appliquée chaque commande du script séquentiellement. | ||
+ | > Lorsque la fin d'une ligne de commande sed est atteinte, la ligne enregistrée et travaillée est alors envoyée sur la sortie standard,\\ | ||
+ | > Puis l'espace de travail est effacé; | ||
+ | > Autrement dit, __leur fonctionnement se base sur une utilisation simple du //"pattern space"//__. | ||
+ | |||
+ | __**La notion de "pattern space"**__\\ | ||
+ | |||
+ | C'est __la mémoire principale (tampon)__ qui permet à sed de travailler ; on la nomme aussi "espace de travail". C'est là que sont enregistrées les données.\\ | ||
+ | |||
+ | Mais sed possède __deux sortes de mémoire tampon__. La __deuxième est appelée "espace annexe" ou "hold space"__.\\ | ||
+ | Cette dernière est un espace mémoire où les données (la ou les ligne(s)) peuvent être enregistrées provisoirement.\\ | ||
+ | Certaines commandes permettent de modifier l'adressage des lignes tel qu'il est enregistré dans l'une de ces mémoires.\\ | ||
+ | D'autres, permettent aussi un échange de données d'une mémoire à l'autre.\\ | ||
+ | |||
+ | **Il reste à présenter :** | ||
+ | * Les commandes multi-lignes (N,D,P) | ||
+ | * Les commandes utilisant la mémoire annexe (h,H,g,G,x) | ||
+ | * Les commandes de tests faisant appel à des étiquettes (:,b,t,T) | ||
+ | </note> |