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] |
— (Version actuelle) | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== 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 ===== | ||
- | ====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> | ||