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 [23/07/2014 07:45] Hypathie [Sed et les regexp simples] |
utilisateurs:hypathie:tutos:sed-et-les-expressions-rationnelles [27/07/2014 10:08] Hypathie [Les adressages de la commande s] |
||
---|---|---|---|
Ligne 33: | Ligne 33: | ||
- expression régulière :\\ ''*'' -> zéro ou plusieurs fois l'élément précédent (b*BABA -> BABA, bBABA, bbBABA, bbbBABA, etc.) | - expression régulière :\\ ''*'' -> zéro ou plusieurs fois l'élément précédent (b*BABA -> BABA, bBABA, bbBABA, bbbBABA, etc.) | ||
- expression régulière :\\ ''.*'' -> zéro ou plusieurs occurrence(s) de n'importe quel caractère | - expression régulière :\\ ''.*'' -> zéro ou plusieurs occurrence(s) de n'importe quel caractère | ||
- | |||
- | -> **Il s'y ajoute pour sed __le caractère__ ''&'' :**\\ | ||
- | - **''&''** : Représente la chaîne à remplacer((ce qu'on ajoute autour de ''&'' est ajouté à la chaîne remplacée)). | ||
-> __**utilisation des classes**__ : | -> __**utilisation des classes**__ : | ||
Ligne 108: | 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 141: | 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 avec délimiteurs "/ /" :=== | + | |
- | soit le fichier sed2.txt | + | |
- | <code> | + | |
- | aaaa | + | |
- | BBB titi | + | |
- | cCcC | + | |
- | # | + | |
- | 12345 | + | |
- | BBB | + | |
- | titi cCcC | + | |
- | titi BBB | + | |
- | /coucou/titi | + | |
</code> | </code> | ||
+ | ou | ||
<code user> | <code user> | ||
- | sed '/^B/d' ~/sed2.txt | + | sed -r '/B{3}/s/BBB/GAGA/' 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 | ||
+ | GAGA | ||
cCcC | cCcC | ||
# | # | ||
12345 | 12345 | ||
+ | GAGA | ||
titi cCcC | titi cCcC | ||
- | titi BBB | ||
</code> | </code> | ||
Ligne 228: | Ligne 199: | ||
</code> | </code> | ||
- | ===Adressage mixte=== | + | ===Adressages mixtes : 'n,/regexp/' ou '/regexp/,n' === |
- | ''n'' et ''m'' sont des nombres entiers naturels | + | |
- | * sed 'n,ms/chaine 1/chaine 2/' fichier | + | __1) 'n,/regexp/s/chaineA/chaineB'__ |
- | >On remplace chaine 1 par chaine 2 de la ligne n à la ligne m. | + | ''n'' est un nombre entier. |
+ | On remplace chaîneA par chaîneB de la ligne ''n'' à la ligne comportant /regexp/.\\ | ||
- | * sed '/chaine 1/s/chaine 2/chaine 3/' fichier | + | * Préparation : fichier "sed1.txt |
- | + | <code> | |
- | >On remplace chaine 2 par chaine 3 pour la ou les ligne(s) adressées par chaine 1. | + | 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> | <code user> | ||
- | cat sed1.txt | + | sed '2,/cerise/s/[[:digit:]]/GAGA/' sed1.txt |
- | aaaa | + | |
- | BBB | + | |
- | cCcC | + | |
- | # | + | |
- | 12345 | + | |
- | BBB | + | |
- | titi cCcC | + | |
</code> | </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> | <code user> | ||
- | sed '2,6s/BBB/GAGA/' sed1.txt | + | sed '/orange/,5s/[[:digit:]]/GAGA/' sed1.txt |
</code> | </code> | ||
- | ou | + | <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 n n'arrêtera pas la substitution. | ||
<code user> | <code user> | ||
- | sed -r '2,6s/B{3}/GAGA/' 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> | ||
- | aaaa | + | AAAA GAGA fraise |
- | GAGA | + | GAGA BBB orange |
- | cCcC | + | AAAA GAGA cerise |
- | # | + | BBB GAGA abricot |
- | 12345 | + | GAGA AAAA pomme |
- | GAGA | + | BBB GAGA poire |
- | titi cCcC | + | |
</code> | </code> | ||
+ | </note> | ||
+ | === Adressage avec n° d'occurrence (fonctionne sur une ligne)=== | ||
<code user> | <code user> | ||
- | sed '/BBB/s/BBB/GAGA/' sed1.txt | + | 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> | ||
- | ou | ||
<code user> | <code user> | ||
- | sed -r '/B{3}/s/BBB/GAGA/' sed1.txt | + | sed -r 'N;s/^(.*)\n\1$/X/g' essai |
</code> | </code> | ||
<code> | <code> | ||
- | aaaa | + | X |
- | GAGA | + | coucou coucou |
- | cCcC | + | |
- | # | + | |
- | 12345 | + | |
- | GAGA | + | |
- | titi cCcC | + | |
</code> | </code> | ||
Ligne 388: | Ligne 388: | ||
</code> | </code> | ||
+ | ===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> | ||
+ | |||
+ | ===le caractère de désignation de champ \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> | ||
=====Sed et les regexp simples ===== | =====Sed et les regexp simples ===== | ||
====Explications==== | ====Explications==== |