next up previous contents Next: La commande fgrep. Up: Les expressions rationnelles. Previous: Les expressions rationnelles.   Table des matières  

6.1 Vue d'ensemble.

De nombreux utilitaires emploient les expressions rationnelles pour obtenir une plus grande souplesse lors de la manipulation de textes. La commande grep est un exemple d'utilitaire. Au chapitre 5, nous avons utilisé grep pour localiser de simples séquences de lettres dans un texte. A présent, nous allons effectuer des recherches grâce aux expressions rationnelles.

Dans le chapitre précédent, nous avons vu que le caractère ? pouvait être utilisé comme un motif de remplacement (ou joker) dans la mesure où il remplace n'importe quel caractère. Ce motif de remplacement fonctionne avec les noms de fichiers. Dans le cas des expressions rationnelles, le motif de remplacement est . . Aussi, pouvez-vous utiliser la commande grep .3....8 <fichier> pour trouver les numéros de téléphone à 7 chiffres, recherchés dans l'exemple décrit dans l'introduction au présent chapitre.

Les expressions rationnelles sont employées pour effectuer une recherche ligne-par-ligne. Par exemple, si les 7 caractères sont répartis en deux lignes (c'est-à-dire qu'il y a un saut de ligne au milieu), grep ne pourra pas trouver le numéro correspondant à l'expression rationnelle qui lui est passée. En général, un programme qui utilise des expressions rationnelles opère ses recherches une ligne à la fois.

Ci-dessous, se trouvent quelques expressions rationnelles qui constituent une base essentielle. Nous utilisons les commandes grep et egrep pour illustrer l'utilisation des expressions rationnelles (rappelez-vous que l'option -w vaut pour les mots, seulement). Les expressions sont insérées entre des guillemets simples ' ' pour des raisons qui seront expliquées plus tard. [NdT: la recherche de mots anglais a été conservée comme dans le document original.]

grep -w 't[a-i]e'
détecte les mots tee, the et tie. Les crochets ont une signification spéciale. Ils stipulent que la recherche se fera sur un caractère allant de a à i.


grep -w 't[i-z]e'
détecte les mots tie et toe.


grep -w 'cr[a-m]*t'
détecte les mots craft, credit et criquet. Le signe * désigne n'importe quel nombre de caractères parmi ceux cités entre crochets. En l'occurrence, il s'agit de la gamme de caractères allant de a à m.


grep -w 'kr.*n'
détecte les mots kremlin et krypton. Le signe . signifie ``tout caractère'', et le signe * signifie ``un nombre quelconque de fois''.


egrep -w '(th | sh).*rt'
détecte les mots shirt, short et thwart. Le signe | signifie qu'il faut rechercher les correspondances sur th ou sh. egrep se comporte comme grep mais pour des extended regular expressions qui permettent donc l'usage de |. [Le caractère | est un opérateur logique OU (en anglais: OR) qui permet la sélection de ce qui se trouve à gauche ou à droite de |. Ceci est également vrai dans plusieurs langages de programmation]. Notez d'une part, que les crochets indiquent une recherche sur un caractère parmi plusieurs et d'autre part, que les parenthèses sont utilisées avec l'opérateur logique | qui permet la recherche sur un mot parmi plusieurs.


grep -w 'thr[aeiou]*t'
extrait les lignes contenant les mots thread et throat. Une liste de caractères possibles peut se retrouver entre crochets.


grep -w 'thr[^a-f]*t'
sélectionne les lignes contenant les mots throughput et throat. Le signe ^ après le crochet gauche indique que la recherche porte sur tous les caractères sauf ceux qui vont de a à f. Par exemple, le mot thrift ne sera pas détecté puisqu'il contient un f.


Toutes les expressions rationnelles décrites ci-dessus permettent de rechercher des mots (en raison de l'option -w). Si l'option -w n'est pas présente, elles trouveront des correspondances sur des parties de mot, ce qui contribuera à augmenter le nombre de correspondances. Notez également que le signe * signifie ``tout nombre de caractère'', y compris ``pas de caractère''. Par exemple, t[a-i]*e pourrait détecter la séquence te, soit un t et un e sans aucun caractère entre eux.

Le plus souvent, vous utiliserez des expressions rationnelles qui effectuent des recherches sur les lignes entières. Parfois, vous préférerez détecter une ligne qui commence ou se termine par une chaîne donnée. Le caractère ^ spécifie le début d'une ligne et $ la fin. Par exemple, ^The détecte les lignes débutant par The et hack$ les lignes se terminant par hack. Par ailleurs, '^*The.*hack$' extrait les lignes de texte qui commencent par The et se finissent par hack, même si un caractère blanc est présent au début ou à la fin de la ligne. Parce que les expressions rationnelles utilisent des caractères spéciaux (. \ [ ] * + ?), ces derniers ne peuvent être utilisés directement. Cette restriction vous limite sévèrement pour la recherche de caractères tel que . , disons. Pour détecter correctement un caractère . , il convient d'utiliser la séquence \. forçant l'interprétation sur . qui, en conséquence ne sera plus considéré comme un caractère de remplacement. Donc, l'expression rationnelle monfichier.txt pourrait correspondre à monfichiertxt et à monfichier.txt. Cependant, l'expression rationnelle monfichier\.txt ne correspond qu'à monfichier.txt.

Vous pouvez utiliser la plupart des caractères spéciaux en les faisant précéder du signe backslash \ . Par exemple, vous utiliserez \[ pour détecter le caractère réel [, ainsi que \$ pour le caractère $, l'expression \\ pour \, \+ pour + et l'expression \? pour le caractère réel ? (l'usage de ? et + est expliqué ci-dessous).


next up previous contents Next: La commande fgrep. Up: Les expressions rationnelles. Previous: Les expressions rationnelles.   Table des matières  
1-01-2006