Une expression est une chaîne de caractères. Ces caractères qui ont une interprétation en dehors de leur signification littérale sont appelés des méta caractères. un symbole entre guillemets, par exemple, peut dénoter la parole d'une personne, ditto, ou une méta signification pour les symboles qui suivent. Les expressions rationnelles sont des ensembles de caractères et/ou méta-caractères auxquels UNIX accorde des fonctionnalités spéciales. [1]
Les principales utilisations des expressions rationnelles (ER) sont la recherche de texte ou la manipulation de chaînes. Une ER correspond à un seul caractère ou à un ensemble de caractères (une sous-chaîne ou une chaîne complète).
L'astérisque -- * -- correspond à toute répétition de caractères d'une chaîne ou d'une ER la précédant, incluant zéro caractère.
<< 1133* >> correspond à 11 + un ou plus de 3 ainsi que d'autres caractères: 113, 1133, 111312 et ainsi de suite.
Le point -- . -- correspond à un seul caractère, sauf le retour à la ligne. [2]
<< 13. >> correspond à 13 + au moins un caractère (incluant un espace): 1133, 11333 mais pas 13 (un caractère supplémentaire manquant).
La puissance -- ^ -- correspond au début d'une ligne, mais quelque fois, suivant le contexte, inverse la signification d'un ensemble de caractères dans une ER.
Le signe dollar -- $ -- à la fin d'une ER correspond à la fin d'une ligne.
<< ^$ >> correspond à des lignes blanches.
Les crochets -- [...] -- englobent un ensemble de caractères pour réaliser une correspondance dans une seule ER.
<< [xyz] >> correspond aux caractères x, y, ou z.
<< [c-n] >> correspond à tout caractère compris entre c et n.
<< [B-Pk-y] >> correspond à tout caractère compris entre B et P et entre k et y.
<< [a-z0-9] >> correspond à toute lettre en minuscule et à tout chiffre.
<< [^b-d] >> correspond à tous les caractères sauf ceux compris entre b et d. Ceci est un exemple de l'inversion de la signification de l' ER suivante grâce à l'opérateur ^ (prenant le même rôle que ! dans un contexte différent).
Les séquences combinées de caractères entre crochets correspondent à des modèles de mots communs. << [Yy][Ee][Ss] >> correspond à yes, Yes, YES, yEs, et ainsi de suite. << [0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] >> correspond à tout numéro de sécurité sociale (NdT : du pays d'origine de l'auteur).
L'anti-slash -- \ -- échappe un caractère spécial, ce qui signifie que le caractère est interprété littéralement.
Un << \$ >> renvoie la singnification littérale de << $ >>, plutôt que sa signification ER de fin de ligne. De même un << \\ >> a la signification littérale de << \ >>.
Les signes << inférieur et supérieur >> échappés -- \<...\> -- indiquent les limites du mot.
Ces signes doivent être échappés, sinon ils n'ont que leur signification littérale.
<< \<le\> >> correspond au mot << le >> mais pas aux mots << les >>, << leur >>, << belle >>, etc.
bash$ cat fichiertexte This is line 1, of which there is only one instance. This is the only instance of line 2. This is line 3, another line. This is line 4. bash$ grep 'the' fichiertexte This is line 1, of which there is only one instance. This is the only instance of line 2. This is line 3, another line. bash$ grep '\<the\>' fichiertexte This is the only instance of line 2. |
Le point d'interrogation -- ? -- correspond à aucune ou une instance de la précédente ER. Il est généralement utilisé pour correspondre à des caractères uniques.
Le signe plus -- + -- correspond à un ou plus de la précédente ER. Il joue un rôle similaire à *, mais ne correspond pas à zéro occurrence.
# Les versions GNU de sed et awk peuvent utiliser "+", # mais il a besoin d'être échappé. echo a111b | sed -ne '/a1\+b/p' echo a111b | grep 'a1\+b' echo a111b | gawk '/a1+b/' # Tous sont équivalents. # Merci, S.C. |
Les << accolades >> échappées -- \{ \} -- indiquent le nombre d'occurrences à filtrer par une précédente ER.
Il est nécessaire d'échapper les accolades car, sinon, elles ont leur signification littérale. Cette usage ne fait techniquement pas partie de l'ensemble des ER de base.
<< [0-9]\{5\} >> correspond exactement à cinq entiers (caractères entre 0 et 9).
![]() | Les accolades ne sont pas disponibles comme ER dans la version << classique >> (non conforme à POSIX) de awk. Néanmoins, gawk dispose de l'option --re-interval qui les autorise (sans être échappés).
Perl et quelques versions de egrep ne nécessitent pas les accolades échappées. |
Les parenthèses -- ( ) -- délimitent des groupes d' ERs. Elles sont utiles avec l'opérateur << | >> et lors de l'extraction de sous-chaînes en utilisant expr.
L'opérateur d'ER << ou >> -- | -- correspond à n'importe lequel d'un ensemble de caractères constituant l'alternative.
bash$ egrep 're(a|e)d' misc.txt People who read seem to be better informed than those who do not. The clarinet produces sound by the vibration of its reed. |
![]() | Quelques versions de sed, ed et ex supportent les versions échappées des expressions rationnelles étendues décrites ci-dessus. |
Ceci est une autre façon de spécifier un intervalle de caractères à filtrer.
[:alnum:] correspond aux caractères alphabétique et numériques. Ceci est équivalent à [A-Za-z0-9].
[:alpha:] correspond aux caractères alphabétique. Ceci est équivalent à [A-Za-z].
[:blank:] correspond à un espace ou à une tabulation.
[:cntrl:] correspond aux caractères de contrôle.
[:digit:] correspond aux chiffres (décimaux). Ceci est équivalent à [0-9].
[:graph:] (caractères graphiques affichables). Correspond aux caractères compris entre ASCII 33 - 126. Ceci est identique à [:print:], ci-dessous, mais exclut le caractère espace.
[:lower:] correspond aux caractères alphabétique minuscules. Ceci est équivalent à [a-z].
[:print:] (caractères imprimables). Correspond aux caractères compris entre ASCII 32 - 126. C'est identique à [:graph:], ci-dessus, mais en ajoutant le caractère espace.
[:space:] correspond à tout espace blanc (espace et tabulation horizontale).
[:upper:] correspond à tout caractère alphabétiques majuscules. Ceci est équivalent à [A-Z].
[:xdigit:] correspond aux chiffres hexadécimaux. Ceci est équivalent à [0-9A-Fa-f].
![]() | Les classes de caractères POSIX nécessitent généralement d'être protégées ou les doubles crochets ([[ ]]).
Ces classes de caractères pourraient même être utilisées avec le remplacement, jusqu'à un certain point.
Pour voir les classes de caractères POSIX utilisées dans des script, référez-vous à Exemple 12-14 et Exemple 12-15. |
Sed, awk et Perl, utilisés comme filtres dans des scripts, prennent des ERs en arguments lorqu'une transformation ou une analyse de fichiers, ou de flux doit se faire. Voir Exemple A-13 et Exemple A-18 pour des illustrations sur ceci.
"Sed & Awk", par Dougherty et Robbins traite les ER d'une façon complète et lucide (voir la Bibliographie).
[1] | La plus simple forme d'expression rationnelle est un caractère conservant sa signification littérale, ne contenant pas de méta caractères. | |
[2] | Comme sed, awk et grep travaillent ligne par ligne, il n'y aura habituellement pas de retour à la ligne à chercher. Dans les cas où il existerait un retour à la ligne dans une expression à plusieurs lignes, le point correspondra au retour à la ligne.
|
Précédent | Sommaire | Suivant |
Expressions rationnelles | Niveau supérieur | Remplacement |