Question 1Quel symbole correspond au début d'une ligne dans une expression régulière ?
Expressions régulières de base — les motifs de grep
Pratique les expressions régulières de base de grep — les 5 symboles ^/$/./*/[], les regex étendues avec -E, et -o pour n'afficher que la correspondance — en extrayant depuis des fichiers texte.
Un outil pour tester tes regex
Tu peux aussi essayer les motifs de cet article dans le Testeur de regex qui tourne dans le navigateur. Il montre où ton motif correspond dans ton texte d'entrée, sur-le-champ.
Expressions régulières de base — ^ $ . * []
Une expression régulière est une façon de décrire un motif dans du texte. grep interprète la chaîne que tu cherches comme une expression régulière, ce qui te permet de trouver des lignes par des conditions comme « commence par ce caractère » ou « un caractère quelconque ici », et pas seulement par une chaîne fixe. Les 5 symboles à apprendre pour les expressions régulières de base sont ^, $, ., * et [].
^ et $ sont des ancres pour le début et la fin d'une ligne. . correspond à un caractère quelconque, et * signifie zéro répétition ou plus du caractère précédent. [abc] correspond à l'un des caractères entre les crochets, et [a-z] correspond à une minuscule par intervalle. Combine-les pour des recherches flexibles.
^ est le début de ligne, $ la fin de ligne, et . un caractère quelconque.| Symbole | Sens | Exemple | Ce que l'exemple signifie |
|---|---|---|---|
^ | Correspond au début d'une ligne | grep '^c' f | Trouve les lignes qui commencent par c |
$ | Correspond à la fin d'une ligne | grep 't$' f | Trouve les lignes qui finissent par t |
. | Correspond à un caractère quelconque | grep 'c.t' f | Un caractère entre c et t (cat/cot) |
* | Zéro ou plus du caractère précédent | grep 'ab*c' f | Autant de b que tu veux entre a et c (ac/abc) |
[abc] | Correspond à l'un des caractères | grep '[cb]at' f | Trouve cat ou bat |
[a-z] | Un caractère quelconque dans l'intervalle | grep '[a-z]at' f | Une minuscule + at (cat/bat) |
\| | Correspond à l'un ou l'autre (ou) | grep 'cat\|dog' f | Lignes contenant cat ou dog |
echo -e 'cat\ncot\ndog' > words.txt # crée le matériel
grep '^c' words.txt # cat et cot, qui commencent par c
grep 't$' words.txt # cat et cot, qui finissent par t
grep 'c.t' words.txt # cat et cot qui correspondent à c?t
Répétition et classes de caractères — * et []
* signifie zéro répétition ou plus du caractère précédent. ab*c correspond aux lignes où il y a zéro b ou plus, comme ac, abc et abbc. [] correspond à l'un des caractères entre les crochets, donc [cb]at attrape à la fois cat et bat. Écrire un intervalle comme [a-z] représente une minuscule.
echo -e 'ac\nabc\nabbc\naxc' > rep.txt # crée le matériel
grep 'ab*c' rep.txt # ac abc abbc, avec zéro b ou plus
echo -e 'cat\nbat\nrat' > cls.txt # crée le matériel
grep '[cb]at' cls.txt # les 2 lignes cat et bat
Ou — correspondre à l'un ou l'autre avec \|
Dans les expressions régulières de base, | (ou) est traité tel quel comme un caractère ordinaire.
Pour exprimer l'alternance, ajoute une barre oblique inverse et écris \|, donc grep 'cat\|dog' correspond aux lignes contenant cat ou dog.
Avec grep -E, que tu apprendras plus loin, tu peux écrire | directement au lieu de \|.
echo -e 'cat\ndog\nfox' > sel.txt # crée le matériel
grep 'cat\|dog' sel.txt # les 2 lignes contenant cat ou dog
Regex étendues et affichage de la correspondance — grep -E / grep -o
Dans les expressions régulières de base, + | ( ) doivent être échappés, comme \+ \| \( \), mais avec grep -E tu peux les écrire directement. grep -E active les expressions régulières étendues (ERE). Tu peux désormais écrire + (un ou plus), | (ou) et () (groupe) directement, là où la regex de base les exigeait échappés. grep -E 'cat|dog' correspond aux lignes contenant cat ou dog.
grep -o affiche uniquement la sous-chaîne correspondante, et non la ligne entière. S'il y a plusieurs correspondances sur une ligne, il les affiche chacune sur sa propre ligne. C'est pratique quand tu veux extraire d'un log juste les correspondances et les compter.
| Symbole | Sens | Exemple | Ce que l'exemple signifie |
|---|---|---|---|
+ | Un ou plus du précédent | grep -E 'ab+c' f | Un ou plusieurs b entre a et c (abc/abbc) |
| | Correspond à l'un ou l'autre (ou) | grep -E 'cat|dog' f | Lignes contenant cat ou dog |
() | Regroupement | grep -E '(ab)+' f | Une ou plusieurs répétitions de ab (ab/abab) |
-E active les regex étendues, et -o affiche uniquement la partie correspondante.| Comment l'écrire | Sens | Exemple |
|---|---|---|
grep -E | Activer les regex étendues (ERE) | grep -E 'cat|dog' f |
grep -o | Afficher uniquement la partie correspondante | grep -o 'cat' f |
Des regex plus avancées
grep -P (regex compatible Perl) est une extension de GNU grep. Dans ce cours tu apprends les expressions régulières de base (^ $ . * []), grep -E pour activer les regex étendues, et grep -o pour n'afficher que la correspondance. Ils fonctionnent de la même façon sur n'importe quel Linux.
echo -e 'cat\ndog\nfox' > animals.txt # crée le matériel
grep -E 'cat|dog' animals.txt # les 2 lignes cat ou dog
echo -e 'ac\nabc\nabbc' > plus.txt # crée le matériel
grep -E 'ab+c' plus.txt # abc abbc, avec un b ou plus
echo -e 'cat cat dog' > line.txt # crée le matériel
grep -o cat line.txt # affiche chaque cat correspondant sur sa propre ligne
Filtrer la sortie d'une commande — | grep
grep peut chercher non seulement dans un fichier donné en argument mais aussi dans la sortie d'une autre commande passée par un pipe |.
Canalise le résultat de ls ou de cat dans | grep pour le réduire aux seules lignes dont tu as besoin.
ls cmds | grep '^c' affiche uniquement les noms qui commencent par c dans le listing du répertoire cmds, et cat fichier | grep mot filtre le contenu d'un fichier de la même façon.
grep avec | pour la réduire aux seules lignes correspondantes. cmds est un petit répertoire de matériel que tu crées toi-même.mkdir -p cmds # petit répertoire de matériel
touch cmds/cat cmds/cut cmds/sort # prépare 3 noms
ls cmds | grep '^c' # cat et cut, qui commencent par c
echo -e 'apple\nbanana\ncherry' > fruit.txt # crée le matériel
cat fruit.txt | grep an # seulement banana, qui contient an
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Que représente le * dans grep 'ab*c' f ?
Question 3Qu'est-ce qui s'affiche quand tu lances grep -o cat line.txt ?