2009-09-20 12:34:28 +02:00
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<!DOCTYPE html
|
|
|
|
|
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
|
|
|
|
|
"tuteurs://DTD/tml.dtd">
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>grep</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<h1>Exercices sur <code>grep</code> : corrigés</h1>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Ces exercices sont des questions de cours : les solutions se trouvent
|
2002-12-09 04:39:15 +01:00
|
|
|
|
toutes dans les pages de man des commandes en question. On suppose donc
|
2009-09-20 12:27:14 +02:00
|
|
|
|
connues les commandes de <code>less</code>, qui servent à se déplacer dans les
|
|
|
|
|
pages de man... et la commande servant à chercher un mot. Testez les
|
|
|
|
|
commandes sur des fichiers et répertoires d'essai pour vous faire la main et
|
2002-12-09 04:39:15 +01:00
|
|
|
|
comprendre ce qui se passe.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h2><a name="options">Les options de <code>grep</code></a></h2>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<ol>
|
|
|
|
|
|
|
|
|
|
<li><a name="grep1"> <strong>Quelles sont les options de <code>grep</code>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
qui permettent d'obtenir des lignes de contexte (qui précèdent et/ou suivent
|
|
|
|
|
la ligne où figure le mot) ? </strong> </a> <p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Il y en a plusieurs, qui se recoupent :</p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<ul>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> <code>-<em>num</em></code> : le <em>numéro</em> indique le nombre de
|
|
|
|
|
lignes de contexte que l'on veut voir figurer avant et après la ligne où
|
|
|
|
|
figure le mot recherché. Par exemple, si on veut trois lignes de contexte,
|
|
|
|
|
avant et après la mot (soit sept lignes au total), on tape :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep -3 ...
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> <code>-A <em>num</em></code> (<em>after</em>) : le <em>numéro</em>
|
|
|
|
|
indique le nombre de lignes qui doivent suivre la ligne où figure le mot. Si
|
|
|
|
|
on en veut quatre, on tapera :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep -A 4 ...
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> <code>-B <em>num</em></code> (<em>before</em>) : le
|
|
|
|
|
<em>numéro</em> indique le nombre de lignes qui doivent précéder la ligne où
|
|
|
|
|
figure le mot. Si on en veut dix, on tape :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep -B 10 ...
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li> <code>-C</code> (<em>context</em>), qui donne deux lignes de contexte
|
2009-09-20 12:27:14 +02:00
|
|
|
|
avant et après. En fait, les trois lignes suivantes sont strictement
|
|
|
|
|
équivalentes :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<pre>
|
|
|
|
|
grep -2 ...
|
|
|
|
|
grep -C ...
|
|
|
|
|
grep -A 2 -B 2 ...
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul></li>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li><a name="grep2"> <strong>Comment faire apparaître le numéro de la
|
|
|
|
|
ligne où figure le mot recherché ? </strong> </a>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
C'est l'option <code>-n</code> (<em>number</em>) qui sert à cela; le numéro
|
|
|
|
|
figure tout au début de la ligne, suivi d'un deux-points (<code>:</code>) et
|
|
|
|
|
du texte. Par exemple : </p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<span class="prompt">bireme ~ $</span> grep -n violon verlaine.tex
|
2002-12-09 04:39:15 +01:00
|
|
|
|
12:des violons de l'automne
|
|
|
|
|
</pre>
|
|
|
|
|
<p>
|
|
|
|
|
Quand on fait une recherche dans plusieurs fichiers, le nom du fichier figure
|
2009-09-20 12:27:14 +02:00
|
|
|
|
d'abord, puis le numéro de la ligne, et enfin le texte, le tout séparé par des
|
|
|
|
|
deux-points. Par exemple :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<span class="prompt">bireme ~ $</span> grep -n violon *
|
2002-12-09 04:39:15 +01:00
|
|
|
|
verlaine.tex:12:des violons de l'automne
|
|
|
|
|
orchestre:45:Cordes : contrebasse, violoncelle, alto, violons.
|
|
|
|
|
</pre>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<strong>Que se passe-t-il quand on demande également des lignes de
|
|
|
|
|
contexte ?</strong> <p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
La disposition générale ne change pas, par contre, le signe utilisé pour
|
|
|
|
|
séparer la ligne de son numéro est un tiret (<code>-</code>) quand il s'agit
|
2002-12-09 04:39:15 +01:00
|
|
|
|
des lignes de contexte, et un deux-points quand il s'agit de la ligne voulue.
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Par exemple : </p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<span class="prompt">bireme ~ $"</span> grep -nC violon verlaine.tex
|
2002-12-09 04:39:15 +01:00
|
|
|
|
10-
|
|
|
|
|
11-Les sanglots longs
|
|
|
|
|
12:des violons de l'automne
|
|
|
|
|
13-bercent mon coeur
|
|
|
|
|
14-d'une langueur monotone
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li><a name="grep22"> <strong> Comment faire pour afficher le nombre
|
2009-09-20 12:27:14 +02:00
|
|
|
|
d'occurences du mot recherché ? </strong> </a> <p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
On utilise l'option <code>-c</code> (<em>count</em>) :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<span class="prompt">bireme ~ $</span> grep -c violon *
|
2002-12-09 04:39:15 +01:00
|
|
|
|
verlaine.tex:1
|
|
|
|
|
orchestre:1
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li><a name="grep23"> <strong> Comment faire pour que <code>grep</code>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
ignore la casse des caractères (différence entre majuscules et minuscules)
|
|
|
|
|
dans sa recherche ? </strong> </a>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Par défaut, <code>grep</code> fait la différence entre les majuscules et les
|
2002-12-09 04:39:15 +01:00
|
|
|
|
minuscules; pour invalider ce comportement, on utilise l'option
|
|
|
|
|
<code>-i</code> (<em>ignorecase</em>).</p>
|
|
|
|
|
</li>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li><a name="grep4"> <strong>Comment faire pour faire apparaître non pas les
|
|
|
|
|
lignes où figurent le mot, mais les noms des fichiers ?</strong> </a>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
C'est l'option <code>-l</code> qui permet de faire cela : afficher les
|
|
|
|
|
noms des fichiers où figure au moins une fois la chaîne de caractères
|
|
|
|
|
recherchée.</p></li>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li><a name="grep5"> <strong>Comment faire apparaître les lignes où ne
|
|
|
|
|
figurent pas le mot recherché ? </strong> </a>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
On veut en fait inverser le sens de la recherche : c'est l'option
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<code>-v</code> qui fait cela.
|
|
|
|
|
</p></li>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li><a name="grep51"> <strong> Comment faire apparaître les noms des fichiers
|
|
|
|
|
ne contenant pas le mot recherché ? </strong> </a>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
On utilise l'option <code>-L</code>, qui affiche les noms de fichiers où ne
|
|
|
|
|
figurent pas la chaîne de caractères recherchée. Il ne faut bien sûr pas
|
2002-12-09 04:39:15 +01:00
|
|
|
|
confondre les options <code>-l</code> et <code>-L</code>...
|
|
|
|
|
</p></li>
|
|
|
|
|
|
|
|
|
|
<li><a name="grep6"> <strong>Comment faire pour que <code>grep</code> ne
|
2009-09-20 12:27:14 +02:00
|
|
|
|
recherche que les lignes où figure le mot tel quel, et non pas ses
|
|
|
|
|
variantes ? </strong> </a> <p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
C'est l'option <code>-w</code> (comme <em>word</em>) qui sert à cela : un
|
|
|
|
|
mot complet est délimité comme suit :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> Début : la chaîne de caractères est placée au début d'une ligne, ou
|
|
|
|
|
précédée d'un blanc, d'une tabulation ou d'une ponctuation.</li>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> Fin : la chaîne de caractère est placée en fin de ligne, ou suivie
|
2002-12-09 04:39:15 +01:00
|
|
|
|
d'un blanc, d'une tabulation ou d'une ponctuation.</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Si donc on veut chercher «travail» et aucune forme dérivée de ce mot, on
|
|
|
|
|
écrit :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep -w travail mon-fichier
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li><a name="grep3"> <strong>Comment faire pour chercher plusieurs mots à la
|
|
|
|
|
fois en faisant apparaître les numéros des lignes ?</strong> </a> <p>
|
|
|
|
|
On veut chercher toutes les occurences des mots «terre» et «ciel» dans les
|
|
|
|
|
deux premiers chapitres de la première partie de <em>Germinal</em>, avec les
|
|
|
|
|
numéros des lignes. On propose deux solutions, la première utilisant les
|
2002-12-09 04:39:15 +01:00
|
|
|
|
ressources de la syntaxe de <code>grep</code>, la seconde utilisant l'option
|
|
|
|
|
<code>-f</code> avec un fichier.</p>
|
|
|
|
|
|
|
|
|
|
<ol>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> <strong>Syntaxe de <code>grep</code></strong> : La structure
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<code>\(mot1\|mot2\)</code> permet de chercher plusieurs mots. Ici, on tape la
|
2009-09-20 12:27:14 +02:00
|
|
|
|
ligne suivante :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep '\(ciel\|terre\)' <em>fichier</em>
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
On met des apostrophes de part et d'autre de l'expression pour la protéger
|
|
|
|
|
contre le shell, c'est-à-dire pour que le shell ne cherche pas à interpréter
|
2002-12-09 04:39:15 +01:00
|
|
|
|
l'expression.
|
|
|
|
|
</p></li>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> <strong>Option «<code>-f</code> <em>fichier</em>»</strong> : dans un
|
2002-12-09 04:39:15 +01:00
|
|
|
|
fichier quelconque, que nous appellerons <code>liste</code>, on indique les
|
2009-09-20 12:27:14 +02:00
|
|
|
|
mots que l'on recherche : «ciel» et «terre». Chaque ligne correspond à un
|
|
|
|
|
mot recherché. Il ne faut donc pas mettre de ligne comme
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
terre ciel
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p class="continue">
|
2009-09-20 12:27:14 +02:00
|
|
|
|
car le programme chercherait la chaîne de caractères «terre ciel», qui est
|
|
|
|
|
assez improbable en français. Il ne faut pas non plus laisser de ligne
|
|
|
|
|
blanche : le programme afficherait l'ensemble du texte.
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Quelle que soit la solution retenue, on veut ensuite afficher le numéro des
|
2002-12-09 04:39:15 +01:00
|
|
|
|
lignes (option <code>-n</code>); d'autre part, pour que la recherche soit
|
2009-09-20 12:27:14 +02:00
|
|
|
|
exhaustive, il vaut mieux que <code>grep</code> ne fasse pas de différence
|
2002-12-09 04:39:15 +01:00
|
|
|
|
entre les majuscules et les minuscules, avec l'option <code>-i</code>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
(<em>ignore case</em>, ignorer la casse des caractères). Il faut aussi décider
|
|
|
|
|
si on cherche les mots tels quels, sans leurs variantes (comme «terre» au
|
2002-12-09 04:39:15 +01:00
|
|
|
|
pluriel), ou si on accepte ces variantes. Si on ne veut que le mot sans ses
|
2009-09-20 12:27:14 +02:00
|
|
|
|
dérivés, on utilise l'option <code>-w</code>.
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Pour désigner les deux fichiers où faire la recherche, on peut les écrire
|
|
|
|
|
littéralement :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
zola1.txt zola2.txt
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="continue">
|
2009-09-20 12:27:14 +02:00
|
|
|
|
ou, mieux, utiliser les joker du shell :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
<pre>
|
|
|
|
|
zola[12].txt
|
|
|
|
|
</pre>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<p><code>[12]</code> signifie «le caractère 1 ou le caractère 2».</p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<strong>Finalement, on peut taper, au choix</strong> : </p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<pre>
|
|
|
|
|
grep -inw -f liste zola1.txt zola2.txt
|
|
|
|
|
grep -inw -f liste zola[12].txt
|
|
|
|
|
grep -inw '\(ciel\|terre\)' zola1.txt zola2.txt
|
|
|
|
|
grep -inw '\(ciel\|terre\)' zola[12].txt
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Et on obtient :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
zola1.txt:13:ciel, le pavé se déroulait avec la rectitude d'une jetée, au
|
2002-12-09 04:39:15 +01:00
|
|
|
|
milieu de
|
2009-09-20 12:27:14 +02:00
|
|
|
|
zola1.txt:36:brûlaient si haut dans le ciel mort, pareils à des lunes fumeuses.
|
2002-12-09 04:39:15 +01:00
|
|
|
|
Mais, au
|
2009-09-20 12:27:14 +02:00
|
|
|
|
zola1.txt:50:besogne. Les ouvriers de la coupe à terre avaient dû travailler
|
2002-12-09 04:39:15 +01:00
|
|
|
|
tar d, on
|
2009-09-20 12:27:14 +02:00
|
|
|
|
zola1.txt:124:terre, lorsqu'un accès de toux annonça le retour du charretier.
|
2002-12-09 04:39:15 +01:00
|
|
|
|
Le ntement,
|
2009-09-20 12:27:14 +02:00
|
|
|
|
zola1.txt:191:bleues en plein ciel, comme des torches géantes. C'était d'une
|
2002-12-09 04:39:15 +01:00
|
|
|
|
tristesse
|
2009-09-20 12:27:14 +02:00
|
|
|
|
zola1.txt:207: Le manoeuvre, après avoir vidé les berlines, s'était assis à
|
2002-12-09 04:39:15 +01:00
|
|
|
|
terre,
|
|
|
|
|
zola1.txt:222:fois avec tout le poil roussi, une autre avec de la terre jusque
|
|
|
|
|
dans le
|
|
|
|
|
|
|
|
|
|
(...)
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Le résultat est un peu différent quand on n'utilise pas l'option
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<code>-w</code>.</p>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ol>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<h2><a name="regexp">Introduction aux expressions régulières</a></h2>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<code>grep</code> recherche des chaînes de caractères, qui peuvent être un mot
|
|
|
|
|
complet («terre»), une suite de lettres («tre»), ou une expression régulière.
|
|
|
|
|
Les expressions régulières sont des formules qui représentent des chaînes de
|
|
|
|
|
caractères. On cherche alors non pas un mot précis, mais des suites de
|
|
|
|
|
caractères correspondant aux critères demandés. Elles sont d'un usage fréquent
|
|
|
|
|
avec <code>grep</code> bien sûr, mais aussi avec des commandes comme
|
|
|
|
|
<code>less</code>, ou encore au sein d'un éditeur.
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
«Expressions régulières» (<em>Regular expressions</em> en anglais) se
|
|
|
|
|
traduisent en bon français par «expressions rationnelles», mais l'usage est de
|
|
|
|
|
dire «régulières».
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Ces exercices n'entendent pas remplacer un cours sur les expressions
|
2009-09-20 12:27:14 +02:00
|
|
|
|
régulières, ni faire le tour de leurs possibilités.
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<ol>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li><a name="reg1"> <strong>Chercher toutes les lignes commençant par «a» ou
|
|
|
|
|
«A»</strong> </a>. <p>
|
|
|
|
|
Il faut indiquer que l'on veut le début de la ligne, avec le chapeau
|
|
|
|
|
(<em>caret</em> en anglais). Ensuite, on veut préciser que la ligne commence
|
|
|
|
|
par un «a» minuscule ou majuscule. Il y a deux façons de le faire :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> Utiliser l'option <code>-i</code> qui fait ignorer la différence entre
|
2002-12-09 04:39:15 +01:00
|
|
|
|
les majuscules et le minuscules.</li>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> Dire que l'on cherche un «a» ou un «A». C'est à cela que servent les
|
|
|
|
|
crochets : <code>[abc]</code> signifie «a ou b ou c». Ici, ce sera
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<code>[aA]</code>.</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Enfin, il faut protéger les signes contre le shell, pour qu'il ne les
|
|
|
|
|
interprète pas; on met donc l'expression entre apostrophes. Remarque :
|
|
|
|
|
la protection des expressions régulières contre le shell est une question
|
2002-12-09 04:39:15 +01:00
|
|
|
|
complexe....
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Il faut donc écrire :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep -i '^a' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p class="continue">
|
|
|
|
|
ou
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep '^[aA]' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li><a name="reg2"> <strong>Chercher toutes les lignes finissant par
|
2009-09-20 12:27:14 +02:00
|
|
|
|
«rs»</strong> </a> <p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
C'est le dollar (<code>$</code>) qui représente la fin de la ligne. Il faut
|
|
|
|
|
donc écrire : </p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep 'rs$' fichier
|
|
|
|
|
</pre></li>
|
|
|
|
|
|
|
|
|
|
<li><a name="reg3"> <strong>Chercher toutes les lignes contenant au moins un
|
|
|
|
|
chiffre</strong> </a> <p>
|
|
|
|
|
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Pour désigner un chiffre, on peut en indiquer une liste entre crochets :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<code>[0123456789]</code>. Il est plus simple d'utiliser une classe de
|
2009-09-20 12:27:14 +02:00
|
|
|
|
caractères : <code>[0-9]</code> qui désigne, comme la solution précédente,
|
|
|
|
|
n'importe quel chiffre de zéro à neuf.
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Il faut donc taper : </p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<pre>
|
|
|
|
|
grep '[0-9]' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li><a name="reg4"> <strong>Chercher toutes les lignes commençant par une
|
2002-12-09 04:39:15 +01:00
|
|
|
|
majuscule</strong> </a> <p>
|
|
|
|
|
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Comme on l'a vu, c'est le chapeau qui indique le début de la ligne. Pour
|
2002-12-09 04:39:15 +01:00
|
|
|
|
indiquer que l'on cherche une majuscule, on peut soit en donner une liste
|
|
|
|
|
(<code>[ABCDEFGHIJKLMNOPQRSTUVWXYZ]</code>), soit utiliser une classe de
|
2009-09-20 12:27:14 +02:00
|
|
|
|
caractères : <code>[A-Z]</code>, la seconde solution étant, de loin,
|
|
|
|
|
préférable...
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Il faut donc taper :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
<pre>
|
|
|
|
|
grep '^[A-Z]' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li><a name="reg5"> <strong>Chercher toutes les lignes commençant par «B»,
|
|
|
|
|
«E» ou «Q»</strong> </a> <p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Il faut indiquer entre crochets les trois lettres recherchées :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep '^[BEQ]' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li><a name="reg6"> <strong>Chercher toutes les lignes finissant par un point
|
|
|
|
|
d'exclamation</strong> </a> <p>
|
|
|
|
|
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Le point d'exclamation n'a pas de signification particulière avec
|
|
|
|
|
<code>grep</code>, on peut donc le mettre tel quel :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep '!$' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li><a name="reg7"> <strong>Chercher toutes les lignes ne finissant pas par
|
|
|
|
|
un signe de ponctuation (point, virgule, point-virgule, deux-points, point
|
|
|
|
|
d'interrogation, point d'exclamation)</strong> </a><p>
|
|
|
|
|
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Il faut donner une liste de caractères, que l'on ne veut pas voir figurer; la
|
|
|
|
|
liste sera entre crochets, comme on l'a déjà vu, et c'est le chapeau qui
|
|
|
|
|
signifiera, dans ce contexte, «sauf». Par exemple, si on cherche tous les «a»,
|
|
|
|
|
sauf ceux suivi de «b», «c» ou «t», on écrit :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep 'a[^bct]'
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Il y a une seconde difficulté, qui vient de ce que certains caractères sont
|
|
|
|
|
spéciaux avec <code>grep</code>. Vous vous doutez que le chapeau est spécial
|
|
|
|
|
quand il est placé au début de l'expression, et que le dollar l'est quand il
|
|
|
|
|
est placé en fin d'expression. Dans notre cas :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
<ul>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> Le point désigne n'importe quel caractère.</li>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li> Le point d'interrogation signifie «le caractère qui précède apparaît 0 ou
|
|
|
|
|
1 fois». Avec <code>egrep</code>, il fonctionne tout seul, avec
|
|
|
|
|
<code>grep</code>, il faut le faire précéder d'un backslash pour qu'il
|
|
|
|
|
fonctionne; par exemple (avec <code>grep</code>), pour chercher «charbon» ou
|
|
|
|
|
«vagabond», on écrit :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<pre>
|
|
|
|
|
grep 'ar?bo' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p class="continue">
|
2009-09-20 12:27:14 +02:00
|
|
|
|
(chercher la suite de lettre «abo» avec un «r» facultatif entre le «a» et le
|
|
|
|
|
«b»).</p>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Pour que <code>grep</code> interprète littéralement ces caractères, et ne les
|
|
|
|
|
considère plus comme spéciaux, il faut les faire précéder d'un backslash
|
2002-12-09 04:39:15 +01:00
|
|
|
|
(<code>\</code>). Si par exemple vous cherchez toutes les lignes qui se
|
2009-09-20 12:27:14 +02:00
|
|
|
|
terminent par un point, il faut taper :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep '\.$' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Dans notre cas cependant, ces caractères sont protégés par les crochets. On
|
|
|
|
|
peut donc écrire :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep '[^.,;:?!]$' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
On peut aussi utiliser l'option <code>-v</code>, qui prend toutes les lignes
|
2009-09-20 12:27:14 +02:00
|
|
|
|
où ne figure pas une chaîne de caractères donnée; dans ce cas, on tape :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep -v '[.,;:?!]$' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
<li><a name="reg8"> <strong>Comment chercher tous les mots contenant un «r»
|
|
|
|
|
précédé de n'importe quelle lettre majuscule ou minuscule ? </strong>
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</a> <p>
|
|
|
|
|
|
2009-09-20 12:27:14 +02:00
|
|
|
|
On cherche une chaîne de caractères qui soit indifféremment au début ou au
|
|
|
|
|
milieu d'un mot. N'importe quelle lettre, ce sont les classes de caractères
|
|
|
|
|
<code>[a-zA-Z]</code> ou <code>[:alpha:]</code>, qui sont équivalentes.
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Il y a une petite subtilité avec l'emploi de classes du second type; elles
|
|
|
|
|
désignent un groupe de caractères, et il faut mettre une seconde paire de
|
|
|
|
|
crochets pour dire «n'importe quel caractère de cette classe prédéfinie».
|
|
|
|
|
On tape donc au choix :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep '[a-zA-Z]r' fichier'
|
|
|
|
|
</pre>
|
|
|
|
|
<p class="continue">
|
|
|
|
|
ou
|
|
|
|
|
</p>
|
|
|
|
|
<pre>
|
|
|
|
|
grep '[[:alpha:]]r' fichier'
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Attention, dans ces listes ne sont pas compris les caractères accentués...
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p></li>
|
|
|
|
|
|
|
|
|
|
<li><a name="reg9"> <strong>Chercher tous les mots dont la seconde lettre est
|
2009-09-20 12:27:14 +02:00
|
|
|
|
un «r»</strong> </a>.
|
2002-12-09 04:39:15 +01:00
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
C'est le symbole <code>\<</code> qui désigne un début de mot. La première
|
|
|
|
|
lettre du mot est indifférente, la seconde est un «r». On écrit donc :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
<pre>
|
|
|
|
|
grep '\<.r' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Il y a cependant un problème avec les caractères accentués, que
|
|
|
|
|
<code>grep</code> considère comme des blancs. Dans ce cas, il vaut mieux
|
|
|
|
|
procéder autrement : un mot est précédé d'un début de ligne, ou d'un
|
|
|
|
|
blanc ou d'une tabulation. Un début de ligne, c'est le chapeau, un blanc ou
|
|
|
|
|
une tabulation, c'est la classe de caractères <code>[:space:]</code>.
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
On va se servir du pipe (<code>|</code>) qui signifie «ou». Avec
|
2002-12-09 04:39:15 +01:00
|
|
|
|
<code>grep</code>, il faut backslasher le pipe, avec <code>egrep</code> ce
|
2009-09-20 12:27:14 +02:00
|
|
|
|
n'est pas nécessaire. On écrit donc (avec <code>grep</code>) :
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
grep '^.r|[[:space:]].r' fichier
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
2009-09-20 12:27:14 +02:00
|
|
|
|
Ce n'est quand même pas si simple; les mots peuvent être précédés d'un tiret
|
|
|
|
|
(mots composés), d'une apostrophe, de guillemets divers (<code>``</code>,
|
|
|
|
|
<code>"</code>, <code>«</code>, <code><<</code>), et, si l'auteur du
|
|
|
|
|
texte n'est pas respectueux des règles de typographie, d'une ponctuation. Il y
|
|
|
|
|
a donc bien des cas à envisager...
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
|
|
|
|
|
<div class="metainformation">
|
2009-09-27 22:00:55 +02:00
|
|
|
|
Auteur : Émilia Robin, Joël Riou. <date value="from git" />
|
2002-12-09 04:39:15 +01:00
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
|