Le Groupe de Travail Linux

26 avril 1999 : Les expressions régulières
David LUBICZ

1 - Les expressions régulières servent à repérer des séquences de caractères dans un texte. Par exemple,

grep "expression régulière" fichier

donnera toutes les lignes du fichier fichier comportant l'expression régulière donnée. Egalement utilisent les expressions régulières :

sed,
awk,
perl,
emacs,
etc...

2 - Une expression régulière consiste en un agrégat d'opérateurs atomiques et de moyens de les regrouper.

a) Expressions atomiques

1 - un caractère repère ce caractère ;
2 - [x1 x2 ... xn]  repère un caractère qui est dans la liste ;
3 - [^x1 x2 ... xn] repère un  caractère qui n'est pas dans la liste ;
4 - [:alpha:] repère un caractère alphabétique ;
5 - [:digits:] repère un caractère qui est un chiffre ;
6 - [:alnum:] repère un caractère alphanumérique ;
7 - [:space:] repère un caractère espace ;
8 - . repère tout caractère ;
9 - ^ chaîne vide en début de ligne ;
10 - $ chaîne vide en fin de ligne.

b) Opérateurs de répétition

1 - ?  impose au caractère précédent d'être optionnel, et présent au plus une fois ;
2 - * impose au caractère précédent d'être optionnel, et présent au moins une fois ;
3 - + impose au caractère précédent d'être présent une ou plusieurs fois ;
4 - {n} impose au caractère précédent d'être présent n fois ;
5 - {n,} impose au caractère précédent d'être présent un nombre de fois x >= n ;
6 - {,m} impose au caractère précédent d'être présent un nombre de fois x <= m ;
7 - {n,m} impose au caractère précédent d'être présent un nombre de fois x, n <= x <= m ;

c) Opérations sur les expressions régulières

1 - e1 e2  repère la concaténation de ce qui est repéré par e1 et de ce qui est repéré par e2 ;
2 - e1 | e2 repère ce qui est repéré par e1, ou ce qui est repéré par e2 ;

3 - Quelques exemples

- Utilisation des parenthèses :

(to)ta(ti) repère les chaînes de la forme "totati", et place (to) dans une variable \1, et (ti) dans une variable \2. Ainsi,
(to)ta(ti)\1\2 a le même effet que (to)ta(ti)toti et
(to.*ti)\1 repère les chaînes de la forme "to_x__tito_x__ti"

- Répétitions :

toto$ repère toto en fin de ligne ;
{to}{3,} repère tototo ;
to{3} repère tooo ;

- Utilisation dans des commandes :

Si un fichier "nomfich" contient

toto
titi
tata

grep "toto" nomfich renvoie toto

Pour faire des recherches/remplacements dans un fichier, on dispose de la commande

sed -e "s/exp/remplacement/modificateur" < nomfich > nomfich.t

dans laquelle :

1 - exp  est l'expression régulière à repérer ;
2 - remplacement est l'expression régulière par laquelle il faut la remplacer ;
3 - modificateur est un élément qui vaut g si on souhaite que toutes les lignes soient retounées, ou p si on souhaite que seules les lignes modifiées soient retournées ;
4 - < nomfich dit que le fichier source est "nomfich" ;
5 - > nomfich.t dit que le fichier destination est "nomfich.t".

sed -e "s/o/i/g" < nomfich > nomfich.t

met dans "nomfich.t" :

titi
titi
tata

sed -e "s/(t.t.)/\1\1/g" < nomfich > nomfich.t

met dans "nomfich.t" :

totototo
titititi
tatatata

sed -e "s/([:upper:].*)[:space:]([:upper:].*)/\2\1/g" < nomfich > nomfich.t

met dans "nomfich.t" "Foo Bar" chaque fois que "Bar Foo" a été rencontré dans "nomfich".

Si vous avez des critiques, vous pouvez me les faire parvenir.
Si vous rencontrez des fautes de frappes, vous pouvez aussi me les signaler

Vous pouvez retourner au sommaire.