Introduction
En tant qu’administrateurs système, développeurs, ingénieurs QA, ingénieurs de support, etc., il est nécessaire de trouver un motif particulier, comme un ensemble d’adresses IP appartenant à une certaine plage ou une plage d’horodatages ou des groupes de noms de domaine ou de sous-domaines, à partir de fichiers. On pourrait également avoir besoin de trouver un mot orthographié d’une manière particulière ou de trouver des fautes de frappe possibles dans un fichier. C’est là que les expressions régulières entrent en jeu.
Les expressions régulières sont des modèles pour faire correspondre des motifs (ou parfois ne pas faire correspondre des motifs). Elles fournissent un moyen de décrire et d’analyser du texte. Ce tutoriel donnera un aperçu des expressions régulières sans entrer dans les particularités d’un langage particulier. Nous utiliserons simplement egrep pour expliquer les concepts.
Expressions régulières
Les expressions régulières se composent de deux types de caractères :
-
les caractères littéraux réguliers et
-
les métacaractères
sont ceux qui donnent le pouvoir aux expressions régulières.
Considérez le fichier country.txt suivant où la première colonne est le nom du pays, la deuxième colonne est la population du pays, et la troisième colonne est le continent.
$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia
Métacaractères d’ancrage
Le premier groupe de « métacaractères » que nous allons discuter sont ^ et $. ^ et $ correspondent respectivement au début et à la fin d’un motif et sont appelés métacaractères d’ancrage.
Pour trouver le nom de tous les pays dont le nom commence par I, nous utilisons l’expression :
$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe
ou pour trouver tous les pays dont les noms de continent se terminent par e, nous faisons :
$ egrep 'e$' country.txt
Italy,57634327,Europe
Le prochain métacaractère est le point (.), qui correspond à un seul caractère. Pour correspondre à toutes les lignes où le nom du pays comporte exactement 5 caractères :
$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia
Et si nous voulons trouver toutes les lignes où le nom de pays commence par I ou J et comporte 5 caractères ?
$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia
[…] est appelé un ensemble de caractères ou une classe de caractères. À l’intérieur d’un ensemble de caractères, un seul des caractères donnés est correspondant.
Un ^ à l’intérieur de l’ensemble de caractères nie l’ensemble de caractères. L’exemple suivant correspondra à des noms de pays longs de cinq caractères mais qui ne commencent ni par I ni par J.
$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia
Le métacaractère de regroupement et l’alternance
Pour correspondre à toutes les lignes contenant Asie ou Afrique :
$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia
Cela peut aussi être fait en prenant A et a communs.
$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia
Quantificateurs
Au lieu d’écrire
$ egrep '^[IJ]....,' country.txt
on peut écrire
$ egrep '^[IJ].{4},' country.txt
où {} sont appelés les quantificateurs. Ils déterminent combien de fois le caractère précédent doit apparaître.
Nous pouvons également donner une plage :
$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia
Ceci correspondra aux noms de pays commençant par I ou J et ayant de 4 à 6 caractères après.
Il existe quelques raccourcis disponibles pour les quantificateurs. Par exemple,
{0,1} est équivalent à ?
$ egrep '^ab{0,1}c$' filename
est la même chose que
$ egrep '^ab?c' filename
{0,} est équivalent à *
$ egrep '^ab{0,}c$' filename
est la même chose que
$ egrep '^ab*c' filename
{1,} est équivalent à +
$ egrep '^ab{1,}c$' filename
est la même chose que
$ egrep '^ab+c' filename
Voyons quelques exemples impliquant les expressions que nous avons vues jusqu’à présent. Ici, au lieu de rechercher dans un fichier, nous recherchons à partir de l’entrée standard. Le tour que nous utilisons est que nous savons que grep (ou egrep) recherche un motif, et si un motif est trouvé, alors la ligne entière contenant le motif est affichée.
Nous aimerions trouver toutes les façons possibles d’écrire la phrase la combinaison de couleur grise était sa préférée.
L’expression serait :
$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite
the gray colour suit was his favorite
the gray colour suit was his favorite
En regardant l’expression ci-dessus, nous pouvons voir que :
-
grise peut être orthographié comme grise ou grise
-
couleur peut être écrit comme couleur ou color, cela signifie que u est facultatif donc nous utilisons u?
-
de même, préféré ou favori peut être écrit favou?rite
Et pour un code postal américain ?
$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456
83456-
834562
92456-1234
92456-1234
10344-2342-345
Un autre exemple de correspondance de toutes les heures valides sur une horloge 24 heures.
$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02
33:45:11
15:45:33
15:45:33
Dans l’exemple ci-dessus, nous avons dit que si le premier chiffre de l’heure est soit 0 ou 1, alors le second peut être n’importe quel chiffre de 0 à 9. Mais si le premier chiffre est 2, alors les valeurs autorisées pour le deuxième chiffre sont 0, 1, 2 ou 3.
Délimitation de mot
Pour écrire un motif pour correspondre aux mots se terminant par couleur tels que unicolor, aquarelle, multicolore, etc. sont assortis mais pas sans couleur ou coloré. Essayez ces exemples vous-même pour vous familiariser avec eux:
$ egrep 'color\>'
Ensuite, pour faire correspondre sans couleur et coloré, mais pas unicolor, aquarelle, multicolore, etc.
$ egrep '\<color'
Ainsi pour faire correspondre exactement le mot couleur, nous faisons :
$ egrep '\<color\>'
Références arrière
Supposons que nous voulions faire correspondre tous les mots qui ont été tapés en double, comme le le ou avant avant, nous devons utiliser des références arrière. Les références arrière sont utilisées pour mémoriser des motifs.
Voici un exemple :
$ egrep "\<the\> \1"
Ou de manière générique :
$ egrep "\<(.*)\> \1"
L’exemple ci-dessus peut être utilisé pour trouver tous les noms dans lesquels les prénoms et les noms de famille sont identiques. Dans le cas où il y a plusieurs ensembles de parenthèses, alors le deuxième, troisième, quatrième, etc. peuvent être référencés avec \2, \3, \4, etc.
Ceci n’est qu’une introduction à la puissance des expressions régulières.
Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions