Expressions régulières
1 - Introduction
Les expressions régulières ... cette phrase me rappelle des souvenirs de cours ... Nous avions un prof qui nous disait
"On m'a demandé de faire de vous des administrateurs système", "Oui mais en 1 semaine avec 8 heures de cours par jour,
Monsieur". Vous en connaissez beaucoup qui ingurgite du Shell de base, du réseau Unix, de la programation Shell et des
expressions régulières en une semaine ? A mon avis, Non. A moins de prendre de l'Unixime 1000 mg matin, midi, soir et
avant le coucher ; mais toute fois, attention à l'overdose ...
Avec un peu de recul je me suis penché sur cette "bête noire" qui n'est autre que les expressions régulières. Ces
outils sont d'une puissance phénoménale. Les expressions régulières ne sont autre chose qu'un "langage" permettant des
règles sophistiquées de recherche et de remplacement de motif. Elles forment un puissant outil pour la manipulation de
textes et de données. Elles permettent de traiter en quelques secondes des tâches qui prendraient des heures. On les
retrouve partout : Perl, Tcl, awk, Python, Emacs, vi, Delphi, Visual C++, lex, sed ... Vous trouverez dans les lignes
qui suivent des exemples regroupant les cas les plus courants ; j'ai préféré cette approche au lieu de narer des
philosophie métaphysique de cette "bête noire".
2 - Les métacaractères
| Symbole |
Description |
. |
n'importe quel caractère |
[...] |
tout caractère parmis ceux énumérés |
[^...] |
tout caractère exepté ceux énumérés |
^ |
la position en début de ligne |
$ |
la position en fin de ligne |
\< |
la position en début de mot |
\> |
la position en fin de mot |
| (pipe) |
reconnaît l'un ou l'aure des termes qu'il sépare |
? |
0 ou 1 occurence du caractère ou de l'expression régulière précédé |
* |
0 ou n occurences du caractère ou de l'expression régulière précédé |
3 - Exemples
$ egrep 'q[^u]' wordlist.txt
Recherche les mots dont q n'est pas suivi de u.
$ egrep '^(From|Subject|Date):' mailbox
Recherche toute ligne qui commence par From:, Subject: ou Date:.
$ egrep -n '[dD]on't' task
Recherche et affiche chaque ligne du fichier task qui contient l'occurence don't ou Don't -
les numéros de ligne sont aussi affichés (option -n).
$ egrep '^\\$' money
Liste toute les lignes du fichier money commençant avec le caractère $.
$ ls -l | egrep '[^.tex]$'
Liste tous les fichiers et répertoires dans le répertoire courant qui ne se terminent pas avec .tex.
$ ls -l | egrep '[.tex]$'
Liste tous les fichiers et répertoires dans le répertoire courant qui se terminent avec .tex.
Soit un fichier phonelist.txt :
Phone Name ID
3412 Bob 123
3834 Joe 333
1248 Steve 634
1423 John 842
5713 Kate 951
$ egrep '^1' phonelist.txt
Affiche uniquement les lignes dont le numéro de téléphone commence par un 1.
$ egrep '^.2' phonelist.txt
Recherche les lignes avec un 2 à la seconde position et n'importe quel caractère en première position.
$ egrep '^[^1]' phonelist.txt
Recherche les lignes dont le premier caractère est différent de 1.
4 - Les expressions régulières dans Vi
:%s/ */ /g
Remplace un espace ou plus en un espace.
:%s/ *$//
Supprime les espaces en fin de ligne.
:%s/^/ /
Insère un espace au début de chaque ligne.
:%s/^[0-9][0-9]* //
Supprime tous les numéros en début de ligne.
5 - Les expressions régulières avec d'autres outils
- sed
$ sed 's/^$/d' toto.txt
Supprime toutes les lignes vides du fichier.
$ sed 's/"//g' toto.txt
Supprime tous les guillemets dans le fichier.
- awk
$ awk '$0 !~ /^$/' phonelist.txt
Affiche le fichier sans prendre en compte les lignes vides du fichier.
$ awk 'NF > 0' toto.txt
idem.
$ awk '$2 ~ /^[BJ]/ {print $3}' phonelist.txt
Affiche le troisième champs de toutes les lignes dont le second champ commence par B ou J.
$ awk '$2 ~ /Kate|Steve/ {print $0}' phonelist.txt
Affiche les lignes contenant Kate ou Steve dans le second champ.
- grep
Soit le fichier phone2.txt suivant :
Durand, Sophie 4-5471
Bigard, Jean-Marie 8-7463
Roumanoff, Anne 3-8456
Satriani, Joe 7-1554
Saintlazar, Rob 5-8451
Vai, Steve 7-9547
Maiden, Iron 9-6669
grep '\t5-...1' phone2.txt
Affiche les lignes dont le numéro de téléphone commence par un 5 et se termine par un 1.
$ grep '^S[^ ]* R' phone2.txt
Affiche les lignes dont le nom de famille commence par un S et dont le prénom commence par un R.
$ grep '^[M-Z]' phone2.txt
Affiche les lignes dont le nom de famille commence avec les lettres allant de M à Z.
$ grep '^[M-Z].*[12]' phone2.txt
Affiche les lignes dont le nom de famille commence avec les lettres allant de M à Z et dont le numéro de téléphone se termine soit par un 1 soit par un 2.
$ grep ',....\t' phone2.txt
Affiche les lignes dont le prénom est composé de quatre caractères.
|