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 | ||
utilisateurs:hypathie:tutos:accueil [21/07/2014 13:09] Hypathie [L'adressage] |
utilisateurs:hypathie:tutos:accueil [21/07/2014 14:22] paskal suppression à la demande de Hypathie |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Sed et les expressions rationnelles ====== | ====== Sed et les expressions rationnelles ====== | ||
- | **Objet : Apprendre à utiliser les expressions rationnelles spécifiques à sed.** | ||
- | * Niveau requis : {{tag>avisé}} | ||
- | * Commentaires : //Tuto en cours de rédaction // | ||
+ | ==== ==== | ||
- | =====Sed et les regexp simples ===== | + | À SUPPRIMER |
- | ====Explications==== | + | |
- | ===le caractère ^ === | + | |
- | Le caractère ''^'' n'est spécial qu'en début d'E.R. ou immédiatement à gauche dans une chaîne encadrée par des '[]' (voir : "les crochets"). | + | |
- | * Exemple 1 : supprimer la ligne comprenant le caractère "#", du fichier : | + | |
- | <code user> | + | |
- | cat >> ~/sed.txt <<EOF | + | |
- | > abc | + | |
- | > #ABC | + | |
- | > EOF | + | |
- | </code> | + | |
- | + | ||
- | <code user> | + | |
- | sed '/^#/ d' sed.txt | + | |
- | </code> | + | |
- | <code> | + | |
- | abc | + | |
- | </code> | + | |
- | * Exemple 2 : supprimer le caractère # seulement du fichier sed.txt | + | |
- | <code user> | + | |
- | sed -e '/^#/s/#ABC/ABC/' sed.txt | + | |
- | </code | + | |
- | <code> | + | |
- | abc | + | |
- | ABC | + | |
- | </code> | + | |
- | + | ||
- | * Exemple 3 : ne pas supprimer le ligne qui commence par # | + | |
- | + | ||
- | <code user> | + | |
- | sed '/^#/ !d' ~/sed.txt | + | |
- | </code> | + | |
- | <code> | + | |
- | # | + | |
- | </code> | + | |
- | ===Le caractère $ === | + | |
- | Le caractère ''$'' représente la fin de la ligne. | + | |
- | //(Le caractères ''$'' n'est spécial qu'en fin d'E.R ou d'un ensemble d'E.R.)// | + | |
- | + | ||
- | * Exemple : supprimer la ligne finissant par "C" | + | |
- | <code user> | + | |
- | sed -e 's/.*C$//' -e '/^$/ d' sed.txt | + | |
- | </code> | + | |
- | <code> | + | |
- | abc | + | |
- | </code> | + | |
- | + | ||
- | === le point (.)=== | + | |
- | Un point ''.'' est une E.R. d'un seul caractère qui correspond à n'importe quel caractère sauf le saut de ligne. | + | |
- | + | ||
- | * Exemple 1 : | + | |
- | <code user> | + | |
- | echo "a B 2 ! * & : ?" | sed 's/./Gaga/g' | + | |
- | </code> | + | |
- | <code> | + | |
- | GagaGagaGagaGagaGagaGagaGagaGagaGagaGagaGagaGagaGagaGagaGaga | + | |
- | </code> | + | |
- | * Exemple 2, point<espace> : | + | |
- | <code user> | + | |
- | echo "C " | sed 's/. /Coucou/' | + | |
- | </code> | + | |
- | <code> | + | |
- | Coucou | + | |
- | </code> | + | |
- | + | ||
- | ===L'étoile (*)=== | + | |
- | Une E.R. d'un seul caractère suivie d'un ''*'' est une E.R. qui recherche zéro occurrence ou plusieurs de ce caractère.\\ | + | |
- | ''c*123'' -> ''123'' ou ''c123'' ou ''cc123'' ou ''ccc123'', etc. | + | |
- | <note important> | + | |
- | * S'il y a plusieurs choix, alors la chaîne de gauche la plus longue est choisie. | + | |
- | * La E.R ''.*'' représente zéro ou plusieurs occurrences de n'importe quel caractère. | + | |
- | </note> | + | |
- | + | ||
- | ===Les crochets=== | + | |
- | La chaîne non-vide encadrée par ''[ ]'' est considérée comme une ''E.R.'' d'un seul caractère pouvant avoir n'importe quelle valeur définie entre ces ''[]''.\\ | + | |
- | + | ||
- | À l'inverse, la E.R représentée par ''[^...]'' est une chaîne composée de tous caractères à l'exclusion de ceux encadrés.\\ | + | |
- | //( le caractère ''^'' ne spécifie cette fonctionnalité d'exclusion que s'il se trouve en première position, immédiatement après le ''['' )// | + | |
- | + | ||
- | Une combinaison de plusieurs E.R. d'un seul caractère est une E.R. qui correspond à l'ensemble de ce que chaque E.R. désigne.\\ Par exemple ''a[bB]'' recherche ''ab'' ou ''aB''. | + | |
- | + | ||
- | <note> | + | |
- | Les caractères ''.'' , ''*'' , ''['' et ''\'' sont toujours spéciaux sauf s'ils sont encadrés entre ''[]''. | + | |
- | + | ||
- | * ''[A-Za-z-]'' -> Tout caractère alpha ou le ''-''. | + | |
- | * ''[]a-z]'' -> Tout caractère alpha ou le '']''. | + | |
- | + | ||
- | </note> | + | |
- | + | ||
- | ===Le caractère & === | + | |
- | + | ||
- | <code user> | + | |
- | sed 's/[0-9][0-9]*$/[&]/' sed1.txt | + | |
- | </code> | + | |
- | <code> | + | |
- | aaaa | + | |
- | BBB | + | |
- | cCcC | + | |
- | # | + | |
- | [12345] | + | |
- | BBB | + | |
- | titi cCcC | + | |
- | </code> | + | |
- | <code user> | + | |
- | sed 's/[0-9][0-9]*$/(&)/' sed1.txt | + | |
- | </code> | + | |
- | <code> | + | |
- | aaaa | + | |
- | BBB | + | |
- | cCcC | + | |
- | # | + | |
- | (12345) | + | |
- | BBB | + | |
- | titi cCcC | + | |
- | </code> | + | |
- | + | ||
- | + | ||
- | + | ||
- | =====Sed -r : les caractères étendues ===== | + | |
- | Rappel : | + | |
- | + | ||
- | ''+'' ; ''?'' ; ''|'' ; ''( )'' ; ''['' ; ''{ }'' | + | |
- | + | ||
- | === le caractère (+)=== | + | |
- | + | ||
- | * substituer une ou plusieurs fois "z" par OK | + | |
- | + | ||
- | <code user> | + | |
- | echo "abc azbc azzbc azzzbc azzzzbc" | sed -r 's/az+bc/OK/g' | + | |
- | abc OK OK OK OK | + | |
- | </code> | + | |
- | + | ||
- | === Le caractère ( ? )=== | + | |
- | + | ||
- | * substituer zéro ou une fois "z" par OK | + | |
- | + | ||
- | <code user> | + | |
- | echo "abc azbc azzbc azzzbc azzzzbc" | sed -r 's/az?bc/OK/g' | + | |
- | OK OK azzbc azzzbc azzzzbc | + | |
- | </code> | + | |
- | + | ||
- | === Le ou ( | )=== | + | |
- | + | ||
- | * substituer ab ou cd par OK | + | |
- | + | ||
- | <code user> | + | |
- | echo "abef cdef efgh abcd" | sed -r 's/ab|cd/OK/g' | + | |
- | OKef OKef efgh OKOK | + | |
- | </code> | + | |
- | + | ||
- | * substituer ab ou cd par OK et effacer le reste | + | |
- | + | ||
- | <code user> | + | |
- | echo "lflfabef cdef efgh ftyabcdopm" | sed -r\ | + | |
- | 's/^.*[ab|cd]*/OK/g' | + | |
- | OK | + | |
- | </code> | + | |
- | + | ||
- | ===Les parenthèses === | + | |
- | <code user> | + | |
- | echo "a b c d e f" | sed -r 's/(b|e)/X/g' | + | |
- | </code> | + | |
- | <code> | + | |
- | a X c d X f | + | |
- | </code> | + | |
- | + | ||
- | ===Parenthèses et inversion de champs=== | + | |
- | Avec la commande ''s'' (substitution), on peut de définir plusieurs E.R mises entre parenthèses.\\ | + | |
- | Cela permet de faire une inversion en se servant du séparateur de chaque champ à matcher.\\ | + | |
- | + | ||
- | * Exemple : | + | |
- | <code user> | + | |
- | echo "coucou:toto" | sed -r 's/^(.*):(.*)/\2:\1/' | + | |
- | </code> | + | |
- | <code> | + | |
- | toto:coucou | + | |
- | </code> | + | |
- | + | ||
- | <note tip> | + | |
- | /^\(.*\)\1$/ : correspond à une ligne contenant au moins deux fois la même sous-chaîne de caractères | + | |
- | </note> | + | |
- | + | ||
- | ===Les accolades { et } === | + | |
- | Un seul caractère suivie par ''{m}'', ''{m,}'', ou ''{m,n}'' est une E.R. qui correspond au caractère précédant ''{'' s'il est présent, exactement m fois (''m''); au moins m fois (''m,''); entre "m" et "n" fois (''m,n'').\\ | + | |
- | 'm' et 'n' doivent être des entiers positifs ou nuls inférieurs à 256. | + | |
- | + | ||
- | * substituer seulement "aaa, aaaa et aaaaa" par OK | + | |
- | <code user> | + | |
- | echo "a aa aaa aaaa aaaaaa aaaaaaaa aaaaaaa" | sed -r\ | + | |
- | 's/a{3,5}/OK/g' | + | |
- | a aa OK OK OKa OKOK OKaa | + | |
- | </code> | + | |
- | + | ||
- | * substituer trois "a" et plus par OK | + | |
- | + | ||
- | <code user> | + | |
- | echo "a aa aaa aaaa aaaaaa aaaaaaaa" | sed -r 's/a{3,}/OK/g' | + | |
- | a aa OK OK OK OK | + | |
- | </code> | + | |
- | + | ||
- | ===Traitement des mots === | + | |
- | * le caractère ''\<'' | + | |
- | Le caractère ''\<'' oblige l'E.R. à correspondre avec le début d'un mot (mot = chaîne de caractères chiffres, lettres ou '_').\\ ''\<'' doit figurer devant la sous-chaîne désirée. | + | |
- | <code user> | + | |
- | echo "info pour tous informatique" | sed -r 's/\<info/OK/g' | + | |
- | </code> | + | |
- | <code> | + | |
- | OK pour tous OKrmatique | + | |
- | </code> | + | |
- | + | ||
- | * le caractère ''\>'' | + | |
- | Le caractère ''\>'' oblige l'E.R. à correspondre à la fin d'un mot.\\ ''\>'' doit figurer en fin de la sous-chaîne désirée. | + | |
- | <code user> | + | |
- | echo "métrique cosmétique" | sed -r 's/métique\>/OK/g' | + | |
- | </code> | + | |
- | <code> | + | |
- | métrique cosOK | + | |
- | </code> | + | |
- | + | ||
- | ====Les sous-chaînes : associer ( ), [ ], { }==== | + | |
- | * substituer "Hello" par OK | + | |
- | <code user> | + | |
- | echo "coucou Hello Yep" | sed -r 's/[A-Z]{1}[a-z]{4}/OK/g' | + | |
- | </code> | + | |
- | <code> | + | |
- | coucou OK Yep | + | |
- | </code> | + | |
- | + | ||
- | * substituer "ABC-123 abc-123" par OK | + | |
- | + | ||
- | <code user> | + | |
- | echo "ABC-123 abc-123" | sed -r 's/[A-Z]{3}-[[:digit:]]{3}\ | + | |
- | [[a-z]{3}-[[:digit:]]{3}/OK/' | + | |
- | OK | + | |
- | </code> | + | |
- | + | ||
- | <note tip> | + | |
- | SHELL : ''\''\\ | + | |
- | + | ||
- | -> Les longues commandes peuvent être sectionnées avec :\\ | + | |
- | + | ||
- | \<retour à la ligne>[<espace>] | + | |
- | + | ||
- | </note> | + | |
- | + | ||
- | * substituer "ab efab ef" par OK | + | |
- | + | ||
- | <code user> | + | |
- | echo "123ab efab ef123" | sed -r 's/(ab[[:blank:]]ef){2}/OK/' | + | |
- | 123OK123 | + | |
- | </code> | + | |
- | + | ||
- | * substituer "123ab efab ef123" par trois "OK" | + | |
- | + | ||
- | <code user> | + | |
- | echo "123ab efab ef123" | sed -r -e 's/(ab[[:blank:]]ef){2}/OK/g'\ | + | |
- | -e 's/[[:digit:]]{3}/OK/g' | + | |
- | OKOKOK | + | |
- | </code> | + | |
- | + | ||
- | * substituer jusqu'à trois "a" par OK | + | |
- | <note tip> | + | |
- | Attention !\\ La E.R ''{,m}'' n'est pas utilisée avec sed.\\ Les chaînes comportant plus de trois "a" contiennent aussi moins de trois "a" ! | + | |
- | <code user> | + | |
- | echo "a aa aaa aaaa aaaaaa aaaaaaaa" | sed -r 's/a{,3}/OK/g' | + | |
- | OK OK OK OKOK OKOK OKOKOK | + | |
- | </code> | + | |
- | + | ||
- | <code user> | + | |
- | echo "a aa aaa aaaa aaaaaa aaaaaaaa" | sed -r\ | + | |
- | 's/(a{1}[[:blank:]]|a{2}[[:blank:]])/OK/g' | + | |
- | OKOKaOKaaOKaaaaOKaaaaaaaa | + | |
- | </code> | + | |
- | </note> | + | |
- | <code user> | + | |
- | echo "a aa aaa aaaa aaaaaa aaaaaaaa" | sed -r\ | + | |
- | -e 's/(a{1}[[:blank:]])/OK/' -e 's/(a{2}[[:blank:]])/OK/' | + | |
- | OKOKaaa aaaa aaaaaa aaaaaaaa | + | |
- | </code> | + |