Les expressions régulières
Présentation
Ce chapitre présente les caractères spéciaux des expressions régulières. Celles-ci sont utilisées par un certain nombre de commandes Unix et fournissent un mécanisme puissant de sélection de chaînes de caractères.
Les expressions régulières sont composées de caractères ordinaires et de caractères ayant une signification particulière. Il existe deux types d’expressions régulières :
-
les expressions régulières basiques (ERb) ;
-
les expressions régulières étendues (ERe).
Les ERb sont utilisées par les commandes suivantes :
-
vi (recherche et substitution) ;
-
grep ;
-
expr ;
-
sed.
Les ERe sont utilisées par les commandes suivantes :
-
grep avec l’option -E, egrep ;
-
awk.
Caractères communs aux ERb et ERe
Caractère spécial |
Signification |
Marqueurs de position |
|
ˆ |
Début de ligne |
$ |
Fin de ligne |
\< |
Début d’un mot. Caractères pouvant faire partie d’un mot : [A-Za-z0-9_] |
\> |
Fin d’un mot |
Représenter un caractère |
|
. |
Un caractère quelconque |
[liste_de_caractères] |
Un caractère cité dans la liste |
[ˆliste_de_caractères] |
Un caractère qui n’est pas cité dans la liste |
Principales classes de caractères POSIX |
|
[:classe:] |
Pour la liste se reporter au chapitre Annexes - Classes de caractères POSIX. L’expression [:classe:] doit elle-même être placée entre crochets. |
Caractère de répétition |
|
* |
0 à n fois le caractère ou regroupement précédent |
Caractère de protection |
|
\c |
Protection du caractère spécial c |
Exemples
Expression régulière |
Signification |
soleil |
Chaîne contenant "soleil". Exemples de correspondance : Aujourd’hui il fait soleil, mais demain ? soleil toujours !! Passer ses vacances au soleil |
ˆsoleil |
Chaîne commençant par "soleil". Exemple de correspondance : soleil toujours !! |
soleil$ |
Chaîne se terminant par "soleil". Exemple de correspondance : Passer ses vacances au soleil. |
ˆsoleil$ |
Chaîne contenant strictement "soleil". |
ˆ[A-Z][5-9].$ ou ˆ[[:upper:]][5-9].$ |
Chaîne composée de trois caractères : le premier est une majuscule, le deuxième un chiffre compris entre 5 et 9, le dernier un caractère quelconque. Exemples de correspondance : B6a Z5* |
7[0-79]A*
|
Chaîne contenant le caractère 7, suivi d’une espace... |
Caractères spécifiques aux ERb
Caractère spécial |
Signification |
Caractères de répétition |
|
\{m\} |
m fois le caractère précédent |
\{m,\} |
Au moins m fois le caractère précédent |
\{m,n\} |
Entre m et n fois le caractère précédent |
Divers |
|
\(ERb\) |
Mémorisation d’une ERb |
\1, \2, ... |
Rappel de mémorisation |
Dans les ERb, le caractère "\" donne une signification spéciale aux parenthèses et accolades.
Exemple
|[0-9]\{5\}| |
Chaîne contenant un nombre à 5 chiffres entouré par deux barres verticales. Exemple de correspondance : route de Vaux|89000|Auxerre |38350|La Mure |
Des exemples de substitution sont donnés au chapitre La commande sed.
Caractères spécifiques aux ERe
Caractère spécial |
Signification |
Caractères de répétition |
|
? |
0 ou 1 fois le caractère ou regroupement précédent |
+ |
1 à n fois le caractère ou regroupement précédent |
{m} |
m fois le caractère précédent |
{m,} |
Au moins m fois le caractère précédent |
{m,n} |
Entre m et n fois le caractère précédent |
Divers |
|
(er1) |
Regroupement |
er1|er2|er3 |
Alternatives |
Dans les ERe, les accolades et parenthèses perdent leur signification spéciale si elles sont précédées d’un antislash.
Exemples
ER |
Signification |
ˆ[+-]?[0-9]+$ |
Chaîne représentant un nombre entier (au moins 1 chiffre) éventuellement précédé d’un signe (0 ou 1 fois). Exemples de correspondance : 2 -56 +235 789654 |
\|[0-9]{5}\| |
Chaîne contenant un nombre à cinq chiffres entouré par deux barres verticales. Exemples de correspondance : route de Vaux|89000|Auxerre |38350|La Mure |
\{[0-9]{2}\}$ |
Chaîne se terminant par deux chiffres entourés par deux accolades. Exemples de correspondance : note1{23} {78} |
ˆtruc|chose$ |
Chaîne commençant par "truc" ou finissant par "chose". |
ˆ(truc|chose)+$ |
Chaîne composée de 1 à n occurrences de "truc" ou de "chose". Exemples de correspondance : truc chose trucchosetruc chosechose |
Exploitation des expressions régulières par les commandes
1. La commande vi
Les ERb sont utilisables dans l’éditeur vi pour la recherche et la substitution de chaînes de caractères.
Syntaxe
Recherche (mode commande) :
/ERb
Substitution (mode ex) :
:[adresse[,adresse]]s/ERB/expression-de-remplacement/[flags]
Des exemples de substitution sont donnés au chapitre La commande sed qui utilise la même syntaxe que l’éditeur vi.
2. La commande grep
Cette section illustre l’utilisation des expressions régulières au travers de la commande grep normalisée par POSIX. Utilisée avec l’option -E, la commande comprend les expressions régulières étendues.
Syntaxe de base
grep [-iv...] expression-régulière-basique [ fic1 .... ]
grep [-iv...] -E expression-régulière-étendue [ fic1 .... ]
La commande grep utilisée avec l’option -E remplace la commande egrep. Pour les autres options, se reporter au manuel de la commande.
Exemples
Voici le fichier tel2.txt :
$ cat tel2.txt
Joyeux Giselle|12. rue de la Source|89290|Vaux|03.45.26.28.47
Dehaut Olivier|3 rue de Pussenval|75020|Paris|01.78.25.96.78
Karama Josette|256 rue de la tempete|56100|Lorient|02.85.26.45.58
Zanouri Joel|45/48 boulevard du Gard|56100|lorient|02/85/56/45/58
Gron Pierre|89-90 rue du chateau|38350|La Mure|04.78.21.23.69
Grival Zoe|3, rue du chateau|38350|La Mure|04.78.21.78.69
$
Recherche de la chaîne "lorient" en majuscules ou minuscules :
$ grep -i 'lorient' tel2.txt
Karama Josette|256 rue de la tempete|56100|Lorient|02.85.26.45.58
Zanouri Joel|45/48 boulevard du Gard|56100|Lorient|02/85/56/45/58
$
Recherche des lignes commençant par la lettre ’K’ :
$ grep 'ˆK' tel2.txt
Karama Josette|256...
Exercices
Les fichiers fournis pour les exercices sont disponibles dans le répertoire dédié au chapitre sous l’arborescence Exercices/fichiers.
1. Expressions régulières
a. Exercice 1 : expressions régulières avec vi
Soit le fichier expr.txt :
$ cat expr.txt
philip 10 bd du Maine 01.10.11.11.11
annie2 25/27 rue Victor Hugo 01.10.48.22.48
fun 20 impasse Marechal Leclerc 01.30.22.33.33
christie rue des petits champs 01/20/45/78/52
chris 01.40.22.33.44
hugues 48 impasse Maréchal Leclerc 01.30.22.53.48
XincX 45 bd Lafayette 01.15.45.45.78
annie2 25 rue Victor Hugo 01.10.48.22.48
XhristiX 35/36 rue des petits champs 01/20/54/58/45
XarinetX rue des petits champs 01.20.54.58.65
Effectuer les opérations suivantes avec l’éditeur vi (mode ex) sur le fichier expr.txt :
1. |
Les numéros de téléphone qui se terminent par 48 doivent désormais se terminer par 50. |
2. |
Remplacer... |