grep et les expressions régulières
Ayant la possibilité de traiter des données entrants sur le stdin
, UNIX possède un nombre d'outils puissants pour le traitement et transformation de ses données.
La philosophie d'UNIX : un outil bien défini pour faire une seule tâche. La puissance se trouve dans le bon enchaînement d'outils pour accomplir une tâche.
grep
: _G_et with _R_egular _E_x_p_ression
grep
: _G_et with _R_egular _E_x_p_ressionUn processeur qui filtre le stdin
et qui émet (sur stdout
) seulement les lignes qui respectent l’expression régulière passé comme paramètre.
cat test.txt | grep "hello"
Ici, grep
prend l'expression "hello"
comme paramètre. C'est l'expression la plus simple : il faut trouver les lignes qui contient le mot hello
uniquement.
Grep peut lire un fichier directement (au lieu de prendre des données du flux stdin
) :
grep [fichier] -e [expression]
... ou peut traverser de façon recursive un répertoire :
grep -r [repertoire] -e [expression]
Les expressions régulières
Une façon de préciser, de manière flexible, un certain nombre de critères pour filtrer un flux de text entrant.
Exemples des wildcards :
abc*
: un text qui contientab
suivi par 0 ou plusieursc
abc+
: un text qui contientab
suivi par 1 ou plusieursc
abc?
: un text qui contientab
suivi par 0 ou 1c
a.c
: un text qui commence aveca
suivi par n’importe quel caractère (un seul) suivi parc
Compter le nombre d'itérations dun caractère :
abc{2}
: un text qui contientab
suivi par 2 foisc
abc{2,}
: un text qui contientab
suivi par au moins 2 foisc
abc{2,5}
: un text qui contient ab suivi par 2 jusqu’à 5 foisc
(mais pas plus)
Séquences de caractères :
a(bc)*
: un text qui contienta
suivi par 0 ou plusieurs séquences debc
a(b|c)
: un text qui contienta
suivi parb
ouc
Types de caractère :
a\d
: un text qui commence aveca
suivi par un chiffre (digit simple)
Emplacement des caractères :
^abc
: un text qui commence parabc
abc$
: un text qui se termine parabc
Énumérer des options avec [ ]
:
[a-zA-Z]
: un caractère qui est une lettre miniscule ou majuscule
Il y a beaucoup de ressources sur les expressions régulières :
Exercice : adresses e-mail
Trouver une expression régulière qui valide le format d’une adresse e-mail de manière suivante :
bob
thirdy3@456
oui
bob(99)@builder.com
Commencez par valider votre expression avec https://regex101.com. Le fichier emails.txt
existe dans vos dossiers. Est-ce que votre expression régulière fonctionne avec grep
?
Exercice : Numéro téléphonique
Rédigez une expression régulière qui identifie un numéro de téléphone valide :
Au moins 10 digits
Commence par une préfixe valable:
Soit un zéro
Soit par un
+
suivi par 2 à 4 chiffres (ex.+33
)
Suivi par un chiffre qui n'est pas zéro (ex.
6
)Suivi par 4 paires de chiffres (ex.
32521467
)
Les numéros +33632521467
, 0632521467
, +27489767831
sont valables parmi les options suivantes :
1432
+33632521467
0632521467
+33249490
+27489767831
1
+334
+33632521467+
Exercice : Lookarounds
J'ai un fichier HTML et je veux extraire uniquement la valeur entre les balises :
<html>
<body>
<p>This is a paragraph</p>
<span>This is a span</span>
<div>Lorem ipsum dolores</div>
</body>
</html>
J'aimerais extraire (avec grep
) uniquement les textes entre les balises sur chaque ligne :
This is a paragraph
This is a span
Lorem ipsum dolores
Astuces :
Regardez les options de
grep
pour voir comment sortir uniquement le texte correspondant et pas toute la ligne qui contient le textVous allez peut-être constater qu'il y a des symboles pas voulus dans le résultat (les balises). Pour les enlever, on peut utiliser les lookarounds (chercher à comprendre sur cette page)
Exercice : guillemets
Est-ce que vous pourriez extraire correctement le contenu de l'attribute translate
? :
<span class="button active" translate="Ceci est un bouton qui s'appelle \"Click me\"!">
Le résultat devrait être :
Ceci est un bouton qui s'appelle \"Click me\"!
Attention, il faut garder les guillemets qui sont échappés.
Je ne vous donne pas la solution ici, essayez de trouver tout seul la solution !
Dernière mise à jour