Home | Linux | Réseaux | Developpement | Divers | FAQ | Forum | Guestbook | Musique |

 

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.

Site hébergé officiellement chez Linux France - © 1999 2005