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 [26/07/2014 13:57] Hypathie [Les rapport d'implication /adressages/ <=> commandes de sed] |
utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste [27/07/2014 14:35] Hypathie [Les rapports d'implication options de sed <=> commandes de sed] |
||
---|---|---|---|
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 229: | Ligne 228: | ||
Ainsi : | Ainsi : | ||
- | - Toutes les commandes peuvent accepter un __//adressage simple//__, certaines autres accepteront en plus un __//adressage double//__. | + | - Certains adressages sont spécifiques à certaines commandes seulement. |
- | - Avec la commande ''y'' il apparaît __l'adressage du numéro d'occurrence__ sur une ligne.((Les deux derniers points seront précisés au paragraphe ci-après, "commandes en fonction de leur adressage".)) | + | - Avec la commande ''s'' il apparaît __l'adressage du numéro d'occurrence__ sur une ligne.((Les deux derniers points seront précisés au paragraphe ci-après, "commandes en fonction de leur adressage".)) |
- Par ailleurs, l'adressage étant tributaire des commandes internes, on recense deux caractères spéciaux d'adressage.\\ | - Par ailleurs, l'adressage étant tributaire des commandes internes, on recense deux caractères spéciaux d'adressage.\\ | ||
Ligne 237: | Ligne 236: | ||
</note> | </note> | ||
- | ====Rappel des types d'adressage ==== | + | ====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 | ||
sans pédale, et porte ses sandales | sans pédale, et porte ses sandales | ||
à son goulot. | à son goulot. | ||
- | il veut pour adresse mail 127.0.0.1@lo | ||
- | </code> | ||
- | |||
- | * Exemple : afficher la dernière ligne de "sed-options" | ||
- | |||
- | <code user> | ||
- | sed -rne '$p' sed-options | ||
- | </code> | ||
- | <code> | ||
il veut pour adresse mail 127.0.0.1@lo | il veut pour adresse mail 127.0.0.1@lo | ||
</code> | </code> | ||
Ligne 272: | Ligne 262: | ||
à son goulot. | à son goulot. | ||
</code> | </code> | ||
+ | ===le caractère d'adressage de dernière ligne ($)=== | ||
+ | * Exemple : afficher la dernière ligne de "sed-options" | ||
+ | |||
+ | <code user> | ||
+ | sed -rne '$p' sed-options | ||
+ | </code> | ||
+ | <code> | ||
+ | il veut pour adresse mail 127.0.0.1@lo | ||
+ | </code> | ||
+ | |||
===Adressage simple=== | ===Adressage simple=== | ||
Ligne 294: | Ligne 294: | ||
* 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''. | ||
- | ====Études des commandes internes en fonction des adressages ==== | + | ====Les commandes de sed supportant les adressages universaux==== |
+ | ^ ^ ^ | ||
+ | |d et D|supprimer | | ||
+ | |p et P |afficher avec ''-n'' | | ||
+ | | = |afficher n° de ligne(s) | | ||
+ | |y/..../..../ | translittération | | ||
+ | |c\texte |changement de texte| | ||
- | ===Les commandes d'adressage simple=== | + | ====Exemples ==== |
+ | ===Préparation === | ||
+ | <code text sed-cmd> | ||
+ | automne | ||
+ | mon bel automne | ||
+ | dans les vergers | ||
+ | du fond du ciel | ||
+ | les éperviers | ||
+ | de tes yeux planent | ||
+ | tes feuilles | ||
+ | tes fruits, ta pomme | ||
+ | et le cerf, et son brame | ||
+ | à jamais aimés | ||
+ | de l'homme | ||
+ | en ton cheveu | ||
+ | me donnent | ||
+ | et des langueurs | ||
+ | et son adieu | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ==="p" : affichage === | ||
+ | <code user> | ||
+ | sed -n '/.*,[[:space:]]/,10p' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | tes fruits, ta pomme | ||
+ | et le cerf, et son brame | ||
+ | à jamais aimés | ||
+ | </code> | ||
+ | |||
+ | ==="d" : suppression === | ||
+ | <code user> | ||
+ | sed '/tes/,10d' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | automne | ||
+ | mon bel automne | ||
+ | dans les vergers | ||
+ | du fond du ciel | ||
+ | les éperviers | ||
+ | de l'homme | ||
+ | en ton cheveu | ||
+ | me donnent | ||
+ | et des langueurs | ||
+ | et son adieu | ||
+ | </code> | ||
+ | === "=" numérotation=== | ||
+ | <code user> | ||
+ | sed '1,$=' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | 1 | ||
+ | automne | ||
+ | 2 | ||
+ | mon bel automne | ||
+ | 3 | ||
+ | dans les vergers | ||
+ | 4 | ||
+ | du fond du ciel | ||
+ | 5 | ||
+ | les éperviers | ||
+ | 6 | ||
+ | de tes yeux planent | ||
+ | 7 | ||
+ | tes feuilles | ||
+ | 8 | ||
+ | tes fruits, ta pomme | ||
+ | 9 | ||
+ | et le cerf, et son brame | ||
+ | 10 | ||
+ | à jamais aimés | ||
+ | 11 | ||
+ | de l'homme | ||
+ | 12 | ||
+ | en ton cheveu | ||
+ | 13 | ||
+ | me donnent | ||
+ | 14 | ||
+ | et des langueurs | ||
+ | 15 | ||
+ | et son adieu | ||
+ | </code> | ||
+ | |||
+ | === "y" : translittération=== | ||
+ | <code user> | ||
+ | sed '2,$!y/a/A/' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | Automne | ||
+ | mon bel automne | ||
+ | dans les vergers | ||
+ | du fond du ciel | ||
+ | les éperviers | ||
+ | de tes yeux planent | ||
+ | tes feuilles | ||
+ | tes fruits, ta pomme | ||
+ | et le cerf, et son brame | ||
+ | à jamais aimés | ||
+ | de l'homme | ||
+ | en ton cheveu | ||
+ | me donnent | ||
+ | et des langueurs | ||
+ | et son adieu | ||
+ | </code> | ||
+ | |||
+ | === "c" : changement de texte=== | ||
+ | <code user> | ||
+ | sed -e '3,$c\ | ||
+ | fleuve Léthé\ | ||
+ | en ton grand coeur\ | ||
+ | devient Vestale\ | ||
+ | ' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | automne | ||
+ | mon bel automne | ||
+ | fleuve Léthé | ||
+ | en ton grand coeur | ||
+ | devient Vestale | ||
+ | </code> | ||
+ | |||
+ | ====Commandes de sed ne supportant que les adressages simples==== | ||
+ | ^ ^ ^ | ||
+ | |i\texte |insérer du texte | | ||
+ | |a\texte |ajouter du texte | | ||
+ | |||
+ | |||
+ | ==="i" : insertion avant la ligne d'adressage=== | ||
+ | <code user> | ||
+ | sed '1i\Ton sentiment comme atmosphère' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | Ton sentiment comme atmosphère | ||
+ | automne | ||
+ | mon bel automne | ||
+ | dans les vergers | ||
+ | du fond du ciel | ||
+ | les éperviers | ||
+ | de tes yeux planent | ||
+ | tes feuilles | ||
+ | tes fruits, ta pomme | ||
+ | et le cerf, et son brame | ||
+ | à jamais aimés | ||
+ | de l'homme | ||
+ | en ton cheveu | ||
+ | me donnent | ||
+ | et des langueurs | ||
+ | et son adieu | ||
+ | </code> | ||
+ | |||
+ | === "a" : ajout après l'adressage=== | ||
+ | <code user> | ||
+ | sed '1a\ ' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | automne | ||
+ | |||
+ | mon bel automne | ||
+ | dans les vergers | ||
+ | du fond du ciel | ||
+ | les éperviers | ||
+ | de tes yeux planent | ||
+ | tes feuilles | ||
+ | tes fruits, ta pomme | ||
+ | et le cerf, et son brame | ||
+ | à jamais aimés | ||
+ | de l'homme | ||
+ | en ton cheveu | ||
+ | me donnent | ||
+ | et des langueurs | ||
+ | et son adieu | ||
+ | </code> | ||
+ | |||
+ | =====La commande "s"===== | ||
+ | ====Méthodes d'appel==== | ||
+ | <code> | ||
+ | s/motif/substitut/[indicateur] fichier | ||
+ | </code> | ||
+ | ou | ||
+ | <code> | ||
+ | cmd | s/motif/substitut/[indicateur] | ||
+ | </code> | ||
+ | |||
+ | >Voir : [[doc:systeme:sed#la-fonction-de-substitution-s]] | ||
+ | |||
+ | ====Détail : /motif/substitut/ ==== | ||
+ | <code user> | ||
+ | s/motif/substitut/ | ||
+ | -> si motif = une regexp | ||
+ | -> alors subtitut = une chaîne de caractère | ||
+ | </code> | ||
+ | |||
+ | >Pour Regexp | ||
+ | >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> | ||
+ | s/expression1/expression2/[indicateur] | ||
+ | </code> | ||
+ | ===les séparateurs ( / )=== | ||
+ | <code user> | ||
+ | echo "aaaa BBB cCcC # 12345" > ~/sed1.txt | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | sed -i 's+ +\n+g' ~/sed1.txt && cat sed1.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | aaaa | ||
+ | BBB | ||
+ | cCcC | ||
+ | # | ||
+ | 12345 | ||
+ | </code> | ||
+ | |||
+ | <note tip> | ||
+ | Tout cela revient au même ;-) | ||
+ | |||
+ | <code user> | ||
+ | echo "aaaa BBB cCcC # 12345" | sed 's+ +\n+g' | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | echo "aaaa BBB cCcC # 12345" | sed 's/ /\n/g' | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | echo "aaaa BBB cCcC # 12345" | sed 's_ _\n_g' | ||
+ | </code> | ||
+ | |||
+ | </note> | ||
+ | |||
+ | |||
+ | ===Les indicateurs=== | ||
+ | |||
+ | ^ ^ ^ | ||
+ | |g | global : toutes les occurrences | | ||
+ | |\n| indicateur de sous-chaîne| | ||
+ | |w | écrire les modifications effectuées dans un fichier | | ||
+ | |p | afficher la ligne modifiée | | ||
+ | |e | exécution d'une commande | | ||
+ | |||
+ | ===Les indicateurs spéciaux=== | ||
+ | ^ ^ ^ | ||
+ | |&|chaîne à remplacer| | ||
+ | |(\n)|sous-chaîne | | ||
+ | |||
+ | ===Le caractère & === | ||
+ | **''&''** : Représente la chaîne à remplacer.\\ | ||
+ | Si le signe ''&'' est présent dans le motif de remplacement, alors, il sera substitué par le motif de recherche en entier. | ||
+ | <code text sed1.txt> | ||
+ | aaaa | ||
+ | BBB titi | ||
+ | cCcC | ||
+ | # | ||
+ | 12345 | ||
+ | BBB | ||
+ | titi cCcC | ||
+ | titi BBB | ||
+ | /coucou/titi | ||
+ | </code> | ||
+ | |||
+ | * Entourer de crochet la chaîne "12345" | ||
+ | |||
+ | <code user> | ||
+ | sed 's/[0-9][0-9]*$/[&]/' sed1.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | aaaa | ||
+ | BBB | ||
+ | cCcC | ||
+ | # | ||
+ | [12345] | ||
+ | BBB | ||
+ | titi cCcC | ||
+ | </code> | ||
+ | |||
+ | * Faire ensorte que le fichier "sed1.txt" ne comporte deux lignes "titi grominet" | ||
+ | <code user> | ||
+ | sed -re 's/titi/& grosminet/' -e\ | ||
+ | '/titi/!d' -e\ | ||
+ | 's/(BBB|cCcC)//' -e\ | ||
+ | '/^ /d' -e\ | ||
+ | '/^\/.*/d' -i\ | ||
+ | sed1.txt | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | cat sed1.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | titi grosminet | ||
+ | titi grosminet | ||
+ | </code> | ||
+ | |||
+ | ===l'indicateur de sous-chaîne (\n) === | ||
+ | ''n'' est le numéro de champ d'une partie du motif de recherche, chaque partie du motif de recherche étant délimitée ainsi ''\(sous-motif\)''. | ||
+ | * Exemple inverser la deuxième ligne de "sed1.txt" | ||
+ | <code user> | ||
+ | |||
+ | </code> | ||
+ | sed -e '2s/\(titi\) \(grosminet\)/\2 \1/g' sed1.txt | ||
+ | <code> | ||
+ | titi grosminet | ||
+ | grosminet titi | ||
+ | </code> | ||
+ | |||
+ | ====Des adressages spéciaux==== | ||
+ | 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. | ||
+ | ===Remarque sur l'adressages mixtes : 'n,/regexp/' ou '/regexp/,n' === | ||
+ | |||
+ | __1) 'n,/regexp/s/chaineA/chaineB'__ | ||
+ | |||
+ | ''n'' est un nombre entier. | ||
+ | On remplace chaîneA par chaîneB de la ligne ''n'' à la ligne comportant /regexp/.\\ | ||
+ | |||
+ | * Préparation : fichier "sed1.txt | ||
+ | <code> | ||
+ | AAAA 2 fraise | ||
+ | 3 BBB orange | ||
+ | AAAA 6 cerise | ||
+ | BBB 1 abricot | ||
+ | 9 AAAA pomme | ||
+ | BBB 5 poire | ||
+ | </code> | ||
+ | |||
+ | * Substitution de la ligne n° 2 jusqu'à la ligne de chaîne "cerise" | ||
+ | <code user> | ||
+ | sed '2,/cerise/s/[[:digit:]]/GAGA/' sed1.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | AAAA 2 fraise | ||
+ | GAGA BBB orange | ||
+ | AAAA GAGA cerise | ||
+ | BBB 1 abricot | ||
+ | 9 AAAA pomme | ||
+ | BBB 5 poire | ||
+ | </code> | ||
+ | |||
+ | __2) '/regexp/ns/chaîneA/chaîneB/'__ | ||
+ | |||
+ | * Substitution à partir de la chaîne "orange" jusqu'à la ligne n° 5 | ||
+ | |||
+ | <code user> | ||
+ | sed '/orange/,5s/[[:digit:]]/GAGA/' sed1.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | AAAA 2 fraise | ||
+ | GAGA BBB orange | ||
+ | AAAA GAGA cerise | ||
+ | BBB GAGA abricot | ||
+ | GAGA AAAA pomme | ||
+ | BBB 5 poire | ||
+ | </code> | ||
+ | |||
+ | <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. | ||
+ | <code user> | ||
+ | sed '/[[:digit:]]/,3s/[[:digit:]]/GAGA/' sed1.txt | ||
+ | </code> | ||
+ | > Cette ligne ne remplacera pas un chiffre par "GAGA" de la première ligne où il y a un chiffre à la ligne 3. | ||
+ | <code> | ||
+ | AAAA GAGA fraise | ||
+ | GAGA BBB orange | ||
+ | AAAA GAGA cerise | ||
+ | BBB GAGA abricot | ||
+ | GAGA AAAA pomme | ||
+ | BBB GAGA poire | ||
+ | </code> | ||
+ | </note> | ||
+ | |||
+ | === Adressage avec n° d'occurrence (fonctionne sur une ligne)=== | ||
+ | <code user> | ||
+ | echo "lalalala" | sed -e 's/la/li/2' | ||
+ | </code> | ||
+ | <code> | ||
+ | lalilala | ||
+ | </code> | ||
+ | |||
+ | ===Adressage du retour chariot === | ||
+ | Par exemple, pour matcher une chaîne constituée de deux chaînes égales séparées par un retour à la ligne, du fichier essai : | ||
+ | <code> | ||
+ | abcd | ||
+ | abcd | ||
+ | coucou coucou | ||
+ | </code> | ||
+ | <code user> | ||
+ | sed -r 'N;s/^(.*)\n\1$/X/g' essai | ||
+ | </code> | ||
+ | <code> | ||
+ | X | ||
+ | coucou coucou | ||
+ | </code> | ||
+ | |||
+ | === Adressage avec le tilde=== | ||
+ | <code text man sed> | ||
+ | first~step | ||
+ | Match every step' th line starting with line first. | ||
+ | </code> | ||
+ | Remplaçons "first" et step" par "n" et "m" qui sont toujours des nombres ! | ||
+ | |||
+ | L'expression ''n ~ m'' ou ''n~m'' signifie simplement :\\ | ||
+ | |||
+ | " la E.R matche toutes les ''n''ième ligne(s) d'un fichier et cela en sautant un nombre de ligne égal à un écart (~) qui est lui-même égal, à la différence entre le nombre ''m'' avec la première ligne du fichier (c'est-à-dire la position ordinal 1). On connaît donc le nombre de ligne sautée en faisant toujours ''m - 1''." | ||
+ | |||
+ | Et si ''n'' est égal à zéro, alors le E.R. match toutes les ''m''ièmes lignes à partir de la ligne ''m'' et saute ''m'' - 1 ligne(s). | ||
+ | |||
+ | * ''1 ~ 2'' : matche les lignes impaires : 1ière, 3ième, 5ième, etc.\\ En effet, de la première ligne du fichier à ''m'' (''m'' = 2), il y a 1. Il sera sauté 1 ligne non-matchée et cela à partir de la ligne n°1 (''n'' = 1). Donc la sélection concerne la première ligne et saute 1 ligne, matche la 3ième ligne et saute 1 ligne, etc. | ||
+ | * ''2~3'' : matche les lignes 2 ; 5 ; 8 ; 11\\ L'écart sauté sera de 2 car de la position 3 (''m'' = 3) à la première ligne du fichier, il y a deux lignes (3-1=2), et cela commence à la deuxième ligne (''n'' = 2). Donc la deuxième ligne est matchée, deux lignes sont sautées (3ième et 4 ième), la 5 ième est matchée, etc. | ||
+ | * 10 ~ 5 : sélection des lignes 10 ; 15 ; 20 ; 25 etc. 5 - 1 = 4 : Il sera sauté 4 lignes non-matchées à partir de la ligne 10. | ||
+ | |||
+ | * 0~5 : sélection des lignes 5 ; 10 ; 15 etc.\\ m-1 = 5-1 = 4 lignes sautées, à partir de la cinquième ligne (''m'' = 5 ). | ||
+ | |||
+ | * Exemple 1: | ||
+ | <code user> | ||
+ | sed '1~2 s_.*[coucou]_OK_' essai-tilde | ||
+ | </code> | ||
+ | <code> | ||
+ | OK/1 | ||
+ | /titi/coucou/2 | ||
+ | OK/3 | ||
+ | /tutu/coucou/4 | ||
+ | OK/5 | ||
+ | /nono/coucou/6 | ||
+ | OK/7 | ||
+ | /lili/coucou/8 | ||
+ | OK/9 | ||
+ | /fofo/coucou/10 | ||
+ | OK/11 | ||
+ | /bibi/coucou/12 | ||
+ | OK/13 | ||
+ | /sisi/coucou/14 | ||
+ | OK/15 | ||
+ | </code> | ||
+ | * Exemple 2 : | ||
+ | <code user> | ||
+ | sed '2~3 s_.*[coucou]_OK_' essai-tilde | ||
+ | </code> | ||
+ | <code> | ||
+ | /toto/coucou/1 | ||
+ | OK/2 | ||
+ | /tati/coucou/3 | ||
+ | /tutu/coucou/4 | ||
+ | OK/5 | ||
+ | /nono/coucou/6 | ||
+ | /lulu/coucou/7 | ||
+ | OK/8 | ||
+ | /fifi/coucou/9 | ||
+ | /fofo/coucou/10 | ||
+ | OK/11 | ||
+ | /bibi/coucou/12 | ||
+ | /zaza/coucou/13 | ||
+ | OK/14 | ||
+ | /baba/coucou/15 | ||
+ | </code> | ||
+ | * Exemple 3 : | ||
+ | <code user> | ||
+ | sed '10~5 s_.*[coucou]_OK_' essai-tilde | ||
+ | </code> | ||
+ | <code> | ||
+ | /toto/coucou/1 | ||
+ | /titi/coucou/2 | ||
+ | /tati/coucou/3 | ||
+ | /tutu/coucou/4 | ||
+ | /nani/coucou/5 | ||
+ | /nono/coucou/6 | ||
+ | /lulu/coucou/7 | ||
+ | /lili/coucou/8 | ||
+ | /fifi/coucou/9 | ||
+ | OK/10 | ||
+ | /dodu/coucou/11 | ||
+ | /bibi/coucou/12 | ||
+ | /zaza/coucou/13 | ||
+ | /sisi/coucou/14 | ||
+ | OK/15 | ||
+ | </code> | ||
+ | * Exemple 4 : | ||
+ | <code user> | ||
+ | sed '0~5 s_.*[coucou]_OK_' essai-tilde | ||
+ | </code> | ||
+ | <code> | ||
+ | /toto/coucou/1 | ||
+ | /titi/coucou/2 | ||
+ | /tati/coucou/3 | ||
+ | /tutu/coucou/4 | ||
+ | OK/5 | ||
+ | /nono/coucou/6 | ||
+ | /lulu/coucou/7 | ||
+ | /lili/coucou/8 | ||
+ | /fifi/coucou/9 | ||
+ | OK/10 | ||
+ | /dodu/coucou/11 | ||
+ | /bibi/coucou/12 | ||
+ | /zaza/coucou/13 | ||
+ | /sisi/coucou/14 | ||
+ | OK/15 | ||
+ | </code> | ||
+ | ====sed : commande d'adressage et script avancé ==== |