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 Les deux révisions suivantes | ||
utilisateurs:hypathie:tutos:sed-et-les-expressions-rationnelles [27/07/2014 08:41] Hypathie [L'adressage] |
utilisateurs:hypathie:tutos:sed-et-les-expressions-rationnelles [27/07/2014 10:08] Hypathie [Les adressages de la commande s] |
||
---|---|---|---|
Ligne 138: | Ligne 138: | ||
</note> | </note> | ||
- | + | ===Adressage du n° de ligne=== | |
- | === Adressage avec numéro de lignes === | + | |
- | + | ||
- | * Exemple avec la commande de suppression ''d'' | + | |
<code user> | <code user> | ||
- | sed '3,4 d' ~/sed1.txt | + | sed -r '6s/BBB/toto/' sed1.txt |
</code> | </code> | ||
<code> | <code> | ||
aaaa | aaaa | ||
BBB | BBB | ||
+ | cCcC | ||
+ | # | ||
12345 | 12345 | ||
+ | toto | ||
+ | titi cCcC | ||
+ | /coucou/titi | ||
</code> | </code> | ||
- | > pas d'option : rien n'est modifié | ||
- | >''d'' : commande de suppression | ||
- | >''3,4'' : ligne 3 et 4 | ||
- | * option ''-e'' et répétition le commande ''d'' : | + | === Adressage d'un champ avec numéro de lignes === |
+ | * Exemple de la ligne 2 à la ligne 4 | ||
<code user> | <code user> | ||
- | sed -e '3d; 4d' ~/sed1.txt | + | sed '2,4s/.*/GAGA/' sed1.txt |
</code> | </code> | ||
<code> | <code> | ||
aaaa | aaaa | ||
- | BBB | + | GAGA |
+ | GAGA | ||
+ | GAGA | ||
12345 | 12345 | ||
- | </code> | ||
- | === Adressage avec n° d'occurrence (fonctionne sur une ligne)=== | ||
- | <code user> | ||
- | echo "lalalala" | sed -e 's/la/li/2' | ||
- | </code> | ||
- | <code> | ||
- | lalilala | ||
</code> | </code> | ||
- | ===Adressage du n° de ligne pour la substitution=== | + | ===Adressage de ligne(s) avec délimiteur "/regexp/"=== |
- | Idem que précédemment, on place le n° devant la commande !\\ | + | On remplace chaineB par chaineC pour la ou les ligne(s) adressées par chaineA |
- | Mais attention ici il s'agit de la substitution ''s'' : | + | |
+ | sed '/chaineA/s/chaineB/chaineC/' fichier | ||
<code user> | <code user> | ||
- | sed -r '6s/BBB/toto/' sed1.txt | + | sed '/BBB/s/BBB/GAGA/' sed1.txt |
- | + | ||
- | </code> | + | |
- | <code> | + | |
- | aaaa | + | |
- | BBB | + | |
- | cCcC | + | |
- | # | + | |
- | 12345 | + | |
- | toto | + | |
- | titi cCcC | + | |
- | /coucou/titi | + | |
- | </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> | ||
+ | ou | ||
<code user> | <code user> | ||
- | sed -r 'N;s/^(.*)\n\1$/X/g' essai | + | sed -r '/B{3}/s/BBB/GAGA/' sed1.txt |
</code> | </code> | ||
- | <code> | ||
- | X | ||
- | coucou coucou | ||
- | </code> | ||
- | |||
- | ===Adressage avec délimiteurs "/ /" :=== | ||
- | soit le fichier sed2.txt | ||
<code> | <code> | ||
aaaa | aaaa | ||
- | BBB titi | + | GAGA |
cCcC | cCcC | ||
# | # | ||
12345 | 12345 | ||
- | BBB | + | GAGA |
titi cCcC | titi cCcC | ||
- | titi BBB | ||
- | /coucou/titi | ||
</code> | </code> | ||
+ | |||
+ | ===Adressage d'une plage avec délimiteurs "/ /,/ /" :=== | ||
<code user> | <code user> | ||
- | sed '/^B/d' ~/sed2.txt | + | sed '/^B/,/^1/d' ~/sed1.txt |
</code> | </code> | ||
- | > Dans le délimiteur, on place la chaîne de caractères ou la regexp qui indique à sed où doit être fait l'action de la commande. | ||
<code> | <code> | ||
aaaa | aaaa | ||
- | cCcC | ||
- | # | ||
- | 12345 | ||
- | titi cCcC | ||
- | titi BBB | ||
</code> | </code> | ||
- | ===Adressage mixte : "ns/regexp/chaine" === | + | ===Adressages mixtes : 'n,/regexp/' ou '/regexp/,n' === |
+ | |||
+ | __1) 'n,/regexp/s/chaineA/chaineB'__ | ||
''n'' est un nombre entier. | ''n'' est un nombre entier. | ||
- | On remplace chaineA par chaineB à la ligne ''n''.\\ | + | On remplace chaîneA par chaîneB de la ligne ''n'' à la ligne comportant /regexp/.\\ |
- | Soit le fichier "sed1.txt": | + | * Préparation : fichier "sed1.txt |
- | <code user> | + | <code> |
- | cat sed1.txt | + | AAAA 2 fraise |
- | aaaa | + | 3 BBB orange |
- | BBB | + | AAAA 6 cerise |
- | cCcC | + | BBB 1 abricot |
- | # | + | 9 AAAA pomme |
- | 12345 | + | BBB 5 poire |
- | BBB | + | |
- | titi cCcC | + | |
</code> | </code> | ||
+ | * Substitution de la ligne n° 2 jusqu'à la ligne de chaîne "cerise" | ||
<code user> | <code user> | ||
- | sed -n '6s/BBB/GAGA/p' sed1.txt | + | sed '2,/cerise/s/[[:digit:]]/GAGA/' sed1.txt |
</code> | </code> | ||
<code> | <code> | ||
- | GAGA | + | AAAA 2 fraise |
+ | GAGA BBB orange | ||
+ | AAAA GAGA cerise | ||
+ | BBB 1 abricot | ||
+ | 9 AAAA pomme | ||
+ | BBB 5 poire | ||
</code> | </code> | ||
- | === Adressage mixte pour une plage, "n,ms/regxp/chaine/=== | + | __2) '/regexp/ns/chaîneA/chaîneB/'__ |
- | ''n'' et ''m'' sont des nombres entiers.\\ | + | |
- | On remplace chaineA par chaineB de la ligne n à la ligne m.\\ | + | |
- | Soit le même fichier "sed1.txt" que précédemment. | + | |
- | sed 'n,ms/chaineA/chaineB/' fichier | + | * Substitution à partir de la chaîne "orange" jusqu'à la ligne n° 5 |
<code user> | <code user> | ||
- | cat sed1.txt | + | sed '/orange/,5s/[[:digit:]]/GAGA/' sed1.txt |
- | aaaa | + | </code> |
- | BBB | + | <code> |
- | cCcC | + | AAAA 2 fraise |
- | # | + | GAGA BBB orange |
- | 12345 | + | AAAA GAGA cerise |
- | BBB | + | BBB GAGA abricot |
- | titi cCcC | + | GAGA AAAA pomme |
+ | BBB 5 poire | ||
</code> | </code> | ||
+ | <note important> | ||
+ | Il faut trois "genres d'objets". Car si /regexp/ d'adressage correspond à chaîne, alors n n'arrêtera pas la substitution. | ||
<code user> | <code user> | ||
- | sed -r -n '2,6s/B{3}/GAGA/p' sed1.txt | + | sed '/[[:digit:]]/,3s/[[:digit:]]/GAGA/' sed1.txt |
</code> | </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> | <code> | ||
- | GAGA titi | + | AAAA GAGA fraise |
- | GAGA | + | GAGA BBB orange |
+ | AAAA GAGA cerise | ||
+ | BBB GAGA abricot | ||
+ | GAGA AAAA pomme | ||
+ | BBB GAGA poire | ||
</code> | </code> | ||
+ | </note> | ||
- | ===Adressage de ligne(s) avec délimiteur "/regexp/" devant s=== | + | === Adressage avec n° d'occurrence (fonctionne sur une ligne)=== |
- | On remplace chaineB par chaineC pour la ou les ligne(s) adressées par chaineA | + | |
- | + | ||
- | sed '/chaineA/s/chaineB/chaineC/' fichier | + | |
<code user> | <code user> | ||
- | sed '/BBB/s/BBB/GAGA/' sed1.txt | + | echo "lalalala" | sed -e 's/la/li/2' |
</code> | </code> | ||
- | ou | + | <code> |
- | <code user> | + | lalilala |
- | sed -r '/B{3}/s/BBB/GAGA/' sed1.txt | + | |
</code> | </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> | <code> | ||
- | aaaa | + | abcd |
- | GAGA | + | abcd |
- | cCcC | + | coucou coucou |
- | # | + | |
- | 12345 | + | |
- | GAGA | + | |
- | titi cCcC | + | |
</code> | </code> | ||
- | ===Adressage d'une plage avec délimiteurs "/ /,/ /" :=== | ||
<code user> | <code user> | ||
- | sed '/^B/,/^1/d' ~/sed1.txt | + | sed -r 'N;s/^(.*)\n\1$/X/g' essai |
</code> | </code> | ||
<code> | <code> | ||
- | aaaa | + | X |
+ | coucou coucou | ||
</code> | </code> | ||
+ | |||
=== Adressage avec le tilde=== | === Adressage avec le tilde=== | ||
<code text man sed> | <code text man sed> |