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 14:06] Hypathie [Les rapport d'implication /adressages/ <=> commandes de sed] |
utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste [28/07/2014 10:52] Hypathie [Commandes indiquant en elle-même un adressage sed] |
||
---|---|---|---|
Ligne 48: | Ligne 48: | ||
</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.// | + | //Ce que j'appelle là "options_cmd_de_sed" est appelé selon la documentation "drapeaux", ou "options", ou encore "indicateur". 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 63: | Ligne 63: | ||
</code> | </code> | ||
- | Soit le fichier nommé "sed-options" : | + | <code text sed-options> |
- | <code> | + | |
Il est vraiment idiot, | Il est vraiment idiot, | ||
se balade sur un vélo | se balade sur un vélo | ||
Ligne 217: | Ligne 216: | ||
</note> | </note> | ||
- | =====Les rapport d'implication /adressages/ <=> commandes de sed===== | + | =====Les rapports d'implication /adressages/ <=> commandes de sed===== |
<note tip> | <note tip> | ||
**Analyse de l'implication : ''/adressages/'' <=> ''cmd_de_sed'' | **Analyse de l'implication : ''/adressages/'' <=> ''cmd_de_sed'' | ||
Ligne 237: | Ligne 236: | ||
</note> | </note> | ||
- | ====Les adressages fonctionnant avec toutes les commandes ==== | + | ====Les adressages universaux ==== |
+ | Il s'agit des adressages qui fonctionnent avec toutes les commandes de sed utilisables en ligne de commandes. | ||
=== le caractère d'exclusion (!)=== | === le caractère d'exclusion (!)=== | ||
<code text sed-options> | <code text sed-options> | ||
- | sed-options | ||
Il est vraiment idiot, | Il est vraiment idiot, | ||
se balade sur un vélo | se balade sur un vélo | ||
Ligne 282: | Ligne 281: | ||
<note important> | <note important> | ||
__Attention avec l'adressage simple !__\\ | __Attention avec l'adressage simple !__\\ | ||
- | * Avec l'adressage simple par numéro de lignes, seule la ligne indiquée par le numéro est traitée. | + | * Avec l'adressage simple par numéro de ligne, seule la ligne indiquée par le numéro est traitée. |
* Avec l'adressage simple par l'encadrement ''/'', toutes les lignes qui correspondent à ''/expression régulière/'' sont traitées . | * Avec l'adressage simple par l'encadrement ''/'', toutes les lignes qui correspondent à ''/expression régulière/'' sont traitées . | ||
</note> | </note> | ||
Ligne 289: | Ligne 288: | ||
===Adressage double === | ===Adressage double === | ||
- | C'est une paire d'adresses simples séparées une virgule. Toutes les combinaisons sont possibles. | + | C'est une paire d'adresses simples séparées par une virgule. Toutes les combinaisons sont possibles. |
- | * deux numéro de ligne ''n,m**cmd_sed**'' : l'analyseur de sed traite les lignes comprises entre les deux adresses, et celles des adresses aussi.\\ | + | * deux numéros de ligne ''n,m**cmd_sed**'' : l'analyseur de sed traite les lignes comprises entre les deux adresses, et celles des adresses aussi.\\ |
- | * deux encadrements ''/ER1/,/ER2/'' : l'analyseur de sed traite les lignes comprises délimitées par les //E.R// de début et de fin en prenant le nombre de lignes le plus large((c'est-à-dire, si l'E.R. de début figure entre les deux adressages, il traite le plage la plus grande.)) | + | * deux encadrements ''/ER1/,/ER2/'' : l'analyseur de sed traite les lignes délimitées par les //E.R// de début et de fin en prenant le nombre de lignes le plus large((c'est-à-dire, si l'E.R. de début figure entre les deux adressages, il traite le plage la plus grande.)) |
* combinaison ''n,/ER/'' : La plage est constituée à partir de la ligne numéro ''n'', jusqu'à la première ligne reconnue par le //E.R.// | * combinaison ''n,/ER/'' : La plage est constituée à partir de la ligne numéro ''n'', jusqu'à la première ligne reconnue par le //E.R.// | ||
* combinaison ''/ER/,n'' : La plage est constituée à partir de la première ligne vérifiant l'expression régulière jusqu'à la ligne de numéro ''n''. | * combinaison ''/ER/,n'' : La plage est constituée à partir de la première ligne vérifiant l'expression régulière jusqu'à la ligne de numéro ''n''. | ||
- | ====Les commandes internes supportant les adressages simples et doubles==== | + | ====Les commandes de sed supportant les adressages universaux==== |
^ ^ ^ | ^ ^ ^ | ||
|d et D|supprimer | | |d et D|supprimer | | ||
Ligne 425: | Ligne 424: | ||
</code> | </code> | ||
- | ====Commandes ne supportant que les adressages simples==== | + | ====Commandes de sed ne supportant que les adressages simples==== |
^ ^ ^ | ^ ^ ^ | ||
|i\texte |insérer du texte | | |i\texte |insérer du texte | | ||
Ligne 433: | Ligne 432: | ||
==="i" : insertion avant la ligne d'adressage=== | ==="i" : insertion avant la ligne d'adressage=== | ||
<code user> | <code user> | ||
- | sed '1i\Ton sentiment comme atmosphère' sed-cmd | + | sed -i '1i\Ton sentiment comme atmosphère' sed-cmd |
+ | </code> | ||
+ | <code user> | ||
+ | cat sed-cmd | ||
</code> | </code> | ||
- | <code> | ||
Ton sentiment comme atmosphère | Ton sentiment comme atmosphère | ||
automne | automne | ||
Ligne 456: | Ligne 457: | ||
=== "a" : ajout après l'adressage=== | === "a" : ajout après l'adressage=== | ||
<code user> | <code user> | ||
- | sed '1a\ ' sed-cmd | + | sed -e '1a\ ' -e '2,$s/^/ /' -i sed-cmd |
+ | </code> | ||
+ | <code user> | ||
+ | cat sed-cmd | ||
</code> | </code> | ||
<code> | <code> | ||
- | automne | + | Ton sentiment comme atmosphère |
- | mon bel automne | + | automne |
- | dans les vergers | + | mon bel automne |
- | du fond du ciel | + | dans les vergers |
- | les éperviers | + | du fond du ciel |
- | de tes yeux planent | + | les éperviers |
- | tes feuilles | + | de tes yeux planent |
- | tes fruits, ta pomme | + | tes feuilles |
- | et le cerf, et son brame | + | tes fruits, ta pomme |
- | à jamais aimés | + | et le cerf, et son brame |
- | de l'homme | + | à jamais aimés |
- | en ton cheveu | + | de l'homme |
- | me donnent | + | en ton cheveu |
- | et des langueurs | + | me donnent |
- | et son adieu | + | et des langueurs |
+ | et son adieu | ||
</code> | </code> | ||
=====La commande "s"===== | =====La commande "s"===== | ||
+ | ====Méthodes d'appel==== | ||
+ | <code> | ||
+ | s/motif/substitut/[options_cmd_de_sed] fichier | ||
+ | </code> | ||
+ | ou | ||
+ | <code> | ||
+ | cmd | s/motif/substitut/[options_cmd_de_sed] | ||
+ | </code> | ||
+ | |||
+ | >Voir : [[doc:systeme:sed#la-fonction-de-substitution-s]] | ||
+ | |||
+ | ====Détail : /motif/substitut/ ==== | ||
+ | <code user> | ||
+ | s/motif/substitut/ | ||
+ | -> si motif = une E.R | ||
+ | -> alors subtitut = une chaîne de caractère | ||
+ | </code> | ||
+ | |||
+ | >Pour //E.R// | ||
+ | >On peut utiliser la syntaxe habituelle, ou la syntaxe étendue avec l'option ''sed -r''. | ||
+ | >Voir : [[utilisateurs:hypathie:tutos:sed-et-les-expressions-rationnelles]] | ||
+ | |||
+ | ====Détail : la ligne de commande "s"==== | ||
<code c> | <code c> | ||
- | s/expression1/expression2/indicateurs | + | s/expression1/expression2/[options_cmd_de_sed] |
</code> | </code> | ||
===les séparateurs ( / )=== | ===les séparateurs ( / )=== | ||
Ligne 515: | Ligne 543: | ||
- | ===Les indicateurs=== | + | ===détail : options-cmd-de-sed=== |
^ ^ ^ | ^ ^ ^ | ||
Ligne 589: | Ligne 617: | ||
</code> | </code> | ||
- | ====La commande "s" et adressages spéciaux==== | + | ====Des adressages spéciaux==== |
- | La commande ''s'' supporte tous les adressages universaux.\\ | + | La commande ''s'' supporte les [[utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste?&#les-adressages-universaux|adressages universaux]].\\ |
Elle permet en plus de nouveaux types d'adressage. | Elle permet en plus de nouveaux types d'adressage. | ||
- | ===Remarque sur l'adressages mixtes : 'n,/regexp/' ou '/regexp/,n' === | + | ===Remarque sur l'adressages mixtes : 'n,/E.R./' ou '/E.R./,n' === |
- | __1) 'n,/regexp/s/chaineA/chaineB'__ | + | __1) 'n,/E.R./s/chaineA/chaineB'__ |
''n'' est un nombre entier. | ''n'' est un nombre entier. | ||
- | On remplace chaîneA par chaîneB de la ligne ''n'' à la ligne comportant /regexp/.\\ | + | On remplace chaîneA par chaîneB de la ligne ''n'' à la ligne comportant /E.R./.\\ |
* Préparation : fichier "sed1.txt | * Préparation : fichier "sed1.txt | ||
Ligne 622: | Ligne 650: | ||
</code> | </code> | ||
- | __2) '/regexp/ns/chaîneA/chaîneB/'__ | + | __2) '/E.R./ns/chaîneA/chaîneB/'__ |
* Substitution à partir de la chaîne "orange" jusqu'à la ligne n° 5 | * Substitution à partir de la chaîne "orange" jusqu'à la ligne n° 5 | ||
Ligne 639: | Ligne 667: | ||
<note important> | <note important> | ||
- | Il faut trois "genres d'objets". Car si /regexp/ d'adressage correspond à chaîne, alors l'indication ''n'' n'arrêtera pas la substitution. | + | Il faut trois "genres d'objets". Car si /E.R./ d'adressage correspond à chaîne, alors l'indication ''n'' n'arrêtera pas la substitution. |
<code user> | <code user> | ||
sed '/[[:digit:]]/,3s/[[:digit:]]/GAGA/' sed1.txt | sed '/[[:digit:]]/,3s/[[:digit:]]/GAGA/' sed1.txt | ||
Ligne 781: | Ligne 809: | ||
</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 du script est atteinte, la ligne est alors envoyée sur la sortie standard, l'espace de travail est effacé; | ||
+ | > une nouvelle ligne est lue en entrée et le contrôle est passée à nouveau au début du script. | ||
+ | |||
+ | 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> |