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-et-les-expressions-rationnelles [27/07/2014 07:32] Hypathie [L'adressage] |
utilisateurs:hypathie:tutos:sed-et-les-expressions-rationnelles [27/07/2014 10:08] Hypathie [Les adressages de la commande s] |
||
---|---|---|---|
Ligne 105: | Ligne 105: | ||
>Pour REGEXP, on peut utiliser la syntaxe habituelle, ou la syntaxe étendue avec l'option ''-r''. | >Pour REGEXP, on peut utiliser la syntaxe habituelle, ou la syntaxe étendue avec l'option ''-r''. | ||
- | =====L'adressage ===== | + | =====Les adressages de la commande s ===== |
===Préparation=== | ===Préparation=== | ||
<code user> | <code user> | ||
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> | ||
Ligne 416: | Ligne 390: | ||
===Le caractère & === | ===Le caractère & === | ||
**''&''** : Représente la chaîne à remplacer.\\ | **''&''** : Représente la chaîne à remplacer.\\ | ||
- | Ce qu'on ajoute autour ou à côté de ''&'' est ajouté à la chaîne remplacée. | + | Si le signe ''&'' est présent dans le motif de remplacement, alors, il sera substitué par le motif de recherche en entier. |
- | <code user> | + | <code text sed1.txt> |
- | sed -e 's/titi/& grosminet/' -e '/titi/!d' sed1.txt | + | aaaa |
+ | BBB titi | ||
+ | cCcC | ||
+ | # | ||
+ | 12345 | ||
+ | BBB | ||
+ | titi cCcC | ||
+ | titi BBB | ||
+ | /coucou/titi | ||
</code> | </code> | ||
- | <code> | + | * Entourer de crochet la chaîne "12345" |
- | BBB titi grosminet | + | |
- | titi grosminet cCcC | + | |
- | titi grosminet BBB | + | |
- | /coucou/titi grosminet | + | |
- | </code> | + | |
<code user> | <code user> | ||
Ligne 440: | Ligne 417: | ||
titi cCcC | titi cCcC | ||
</code> | </code> | ||
+ | |||
+ | * Faire ensorte que le fichier "sed1.txt" ne comporte deux lignes "titi grominet" | ||
<code user> | <code user> | ||
- | sed 's/[0-9][0-9]*$/(&)/' sed1.txt | + | 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> | ||
<code> | <code> | ||
- | aaaa | + | titi grosminet |
- | BBB | + | titi grosminet |
- | cCcC | + | </code> |
- | # | + | |
- | (12345) | + | ===le caractère de désignation de champ \n === |
- | BBB | + | ''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\)''. |
- | titi cCcC | + | * 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> | </code> | ||
=====Sed et les regexp simples ===== | =====Sed et les regexp simples ===== |