Grep et InDesign CS3

Préambule

Je ne suis pas un pro du Grep. Je découvre cet outil qui peut rendre de nombreux services.
Si vous avez des questions, n'hésitez pas à me les poser. J'essaierai d'y répondre. Si je ne trouve pas, je vous redirigerai vers un site ou l'autre.
D'autre part, je travaille avec la CS3 sous Mac. Tous les exemples donnés ici fonctionnent avec cette version.
Il existe, apparemment, des différences entre la version
Mac et la version PC.
Je ne dispose pas encore de la CS4, mais je sais qu'il existe une fonction «styles Grep».



GREP? Qu’est-ce que c’est?

Un programme créé dans les années septante, pour les systèmes d’exploitation Unix. Utilisé pour la recherche et le filtrage de chaînes de caractères. Selon certaines sources, ce terme est un raccourci de global regular expression print. La base historique, dit-on, serait une commande de l’éditeur Unix «ed»: g/RE/p.

Qu’est-ce qu’une «regular expression»?


Une chaîne de caractères, formée de signes génériques (aux significations spécifiques) et de caractères littéraux. En bref, un motif utilisé pour rechercher dans des textes des chaînes de lettres distinctes, afin de les modifier.

Les métacaractères


Le métacaractères, sont des caractères spéciaux, c'est-à-dire qu'ils ont une signification particulière dans la construction des motifs de recherche. De par leur statut de caractères spéciaux, il ne peuvent pas être utilisés n'importe comment. Ces caractères spéciaux ou métacaractères sont les suivants:
^ . $ * + ? | \ [ ] ( ) { }


2009-06-01 — j'ai créé un petit tableau (téléchargeable en bas de cette page — au format pdf), qui reprend tous les codes que j'ai pu trouver dans l'aide.
 

Voici quelques codes à connaître:

. (point) N'importe quel caractère (pour rechercher un point => \.)
Par exemple, pour rechercher toutes les suites de caractères comprenant “c” puis 3 caractères, puis “e”
c...e
Trouve donc carte, corde, coude, casse, cable...
\u N'importe quelle lettre majuscule (any Upper case)
\l N'importe quelle lettre minuscule (any Lower case)
\d N'importe quel chiffre (any Digit)
\w Any Word character. Ceci inclus bas de casse, capitale, les chiffres, et le underscore. Ce “joker” combine \u, \l, et \d, plus le caractère underscore.
\s eSpace (espace, tabulation, retour ou saut de ligne forcé)
~S Espace insécable (justifiante).
Le petit sigle devant S est un tilde, obtenu sur Mac par alt+n
~s Espace insécable (chasse fixe) (attention: il y a une inversion dans la documentation CS3 entre ~s et ~S)
~< Espace fine
Si vous utilisez les mêmes lettres qui ci-dessus, mais en majuscule, vous inversez la requête:
\U Caractère quelconque autre qu'une lettre capitale
\L Caractère quelconque autre qu'une lettre minuscule
\D Caractère quelconque autre qu'un digit
\W Caractère quelconque autre qu'un caractère de mot
\S Caractère quelconque autre qu'une espace (tout espace ou tabulation)
 
( ) Les parenthèses... Très important.
Lorsque vous mettez une expression entre parenthèses dans la partie “Rechercher”, cela forme un groupe.
Exemple: “le chat court après le chien”.
Je recherche “(le chat) (court apres) (le chien)”
Et je remplace par “$3 $2 $1”
Le résultat est “le chien court après le chat”
À l’aide du signe “$” suivi d’un chiffre, on établit une référence au groupe correspondant.

Autre exemple: Vous recherchez n'importe quel nombre suivi d'une espace suivi de “décembre”, et désirez le remplacer par le même digit + espace insécable + décembre:
Rechercher (\d+) (decembre)
Remplacer $1~S$2
Dans le cas de l'anglais, il peut être intéressant de rechercher “31th December” pour le remplacer par “December, 31th”.
Dans ce cas, rechercher (\d+\w*) (December)
remplacer par $2,~S$1
Par la même occasion, je fais une remarque générale: les accents ne sont pas pris en compte dans la partie “Rechercher”.
Pour rechercher le mot “décembre”, il faut encoder “decembre”.
[ ] Jeu de caractères. Par exemple, [a-z] trouve un seul signe contenu dans la chaîne de «a» à «z». [\d.,] pour trouver un digit ou un point ou une virgule
| ou
Par exemple, pour trouver million ou milliard: milli(on|ard)
[-\w] Le \w n'inclus pas le trait d'union, ce qui n'est pas terrible: le trait d'union fait partie d'un grand nombre de mot composé.
En utilisant [-\w], on inclut le trait d'union dans un mot.
(?i) Insensible à la casse activé -> ce groupe n'est pas repris dans la partie “rechercher” (ce groupe est à mettre devant et toujours entre parenthèses).
Si je cherche (?i)Janvier, il me trouve janvier et Janvier
(?-i) Insensible à la casse désactivé.
Si je cherche (?-i)Janvier, il ne trouve QUE “Janvier” (et pas “janvier” ou “JANVIER”

Les répétitions

? Zéro ou une fois
* Zéro ou plusieurs fois
+ Une ou plusieurs fois
?? Zéro ou une fois (correspondance la plus courte)
*? Zéro ou plusieurs fois (correspondance la plus courte)
+? Une ou plusieurs fois (correspondance la plus courte)
{x} Recherche x fois.
b{3} correspond exactement 3 fois
b(3,} correspond au moins 3 fois
b{3,}? correspond au moins 3 fois (correspondance la plus courte)
b{2,3} correspond au moins 2 fois et pas plus de 3 fois
b{2,3}? correspond à 2 fois
 
\< Début de mot
\> Fin de mot
Exemple: pour rechercher les mots “sauce”, “salé”, “salée”, “sablé”… (oui, je travaille dans un livre de recettes)
\<sa\w+e\>
Explication: je cherche un mot qui commence par “sa” puis n'importe quel caractère (une ou plusieurs fois) et qui se termine par “e”
^ Début de paragraphe
$ Fin de paragraphe
(?<= ) Lookbehind positif
(?= ) Lookahead positif
Lookbehind veut dire regarder derrière et Lookahead signifie regarder devant. En évoquant cette technique d'une manière générale, on utilise le terme Lookaround (regarder autour).
Par exemple:
(?<=").+?(?=")
Sélectionne tout le texte placé entre deux guillemets dans le même paragraphe (pour appliquer un style caractère, par exemple).
Le +? représente la répétition “une ou plusieurs fois” (correspondance la plus courte).
 
Au tableau!
a-comment faire pour trouver un nombre suivi d'une espace suivi de “litre” ou “litres”?
b-comment mettre une espace insécable entre un chiffre et mm², cm², m², km² ...
c-comment changer le point du séparateur de millier en une espace insécable?
 
Réponse:
a- \d+ litres?
Le ? ne concerne que le dernier caractère (le "s" final).
Il trouve donc 1 litre tout autant que 100 litres.
b- (\d)\s(\w?m2) remplacer par $1~S$2
c- (\d)\.(\d{3}) remplacer par $1~<$2



Les quelques requêtes que j’utilise

Rechercher Remplacer par Explications
(?i)(\d)[\s~S](mil|bil|duiz|thous) $1~S$2 Rechercher un digit + une espace + mil ou bil ou duiz ou thous (pour millier, milliers, million, millions, miljoen, billion, duizend, thousand)
Remplacer par le résultat de la recherche 1 + espace insécable + le résultat de la recherche 3
(\d)[\s~S](€|EUR|USD|CHF|GBP) $1~S$2 Rechercher un digit + une espace + la monnaie
Remplacer par le digit + espace insécable + la monnaie
(€|EUR|USD|CHF|GBP)[\s~S](\d) $1~S$2 Rechercher la monnaie + une espace + un digit
Remplacer par la monnaie + espace insécable + le digit
On peut aussi facilement intervertir la monnaie et le montant en remplaçant par $2~S$1
(?i)(\d)[\s~S](Janvier|Fevrier|Mars|Avril|Mai|Juin|
Juillet|Aout|Septembre|Octobre|Novembre|Decembre)
$1~S$2 Rechercher un digit + une espace + un mois (en toute lettre) et remplace l'espace par une espace insécable.
Remarque: respect de la casse activée.
([\d~<,]+)[\s~S]?€ €~S$1 Peter Kahrel propose ceci pour rechercher tout montant suivi éventuellement d'une espace et du sigle €, et le remplacer par le sigle € + ce montant + espace insécable,
[\d~<,]+ recherche toutes les séquences contenant un digit, une espace fine ou une virgule, dans n'importe quel ordre;
[\s~S]? recherche n'importe quelle espace; Le ? permet de dire il peut y avoir une ou aucune espace avant le sigle €
-([\d~<,]+) ($1) Rechercher un signe négatif devant un nombre et remplacer par ce nombre entre parenthèse (utilisé par les financiers)
Exemple: -251,18 devient (251,18)
(?<=\w)((\s|~S)*?)([?!;:]) ~<$3 Pour mettre une espace fine avant les signes de ponctuations suivants ?!;:
Rechercher une lettre quelconque (non attrapée) + une espace quelconque (attention: l'espace insécable n'est pas prise en compte dans le \s -> j'ai donc du ajouter ~S) + un signe de ponctuation
Remplacer par espace fine + le signe de ponctuation
(?<=").+?(?=")   Sélectionne tout le texte placé entre deux guillemets dans le même paragraphe (pour appliquer un style caractère, par exemple)
Le +? représente la répétition “une ou plusieurs fois” (correspondance la plus courte)
(http|ftp|www)(\S+)   Sélectionne n'importe quelle URL (pour appliquer un style caractère, par exemple).
(http|ftp|www)(\S+) recherche (http OU ftp OU www) suivi de n'importe quelle suite de caractères qui ne contient pas d'espace.
\S+@\S+\.\S+
ajouté le 2009-06-01
  Sélectionne n'importe quelle adresse email (pour appliquer un style caractère, par exemple).
\S+ trouve au moins un caractère autre qu'une espace (y compris le point).
\. trouve un point




Liens utiles:


En français: 

Malheureusement, il n'existe pas beaucoup de références en français concernant grep.
Ajouté le 2009-09-10 - Laurent Tournier a créé un site: GREP et InDesign CS3/CS4. Il donne des explications sur les cas que nous pouvons rencontrer dans le domaine de la mise en page. Très intéressant.

Voici quelques tutoriels / exemples:



En anglais: 



Je vous recommande d'acheter ($9.99) le pdf en ligne "GREP in InDesign CS3/CS4" de Peter Kahrel ici
GREP in InDesign CS3/CS4. Ce document fourmille d'idées géniales. Le seul reproche que je pourrais faire, c'est que l'auteur cherche parfois à faire l'expression la plus courte (ce qui n'est pas toujours compréhensible).

Remerciements

Je tiens à remercier spécialement Hans Häsler, qui a écrit deux articles sur le Grep dans le Bulletin technique. Hans m'a permis de reprendre quelques extraits de ces articles ici-même. Je vous livre aussi le lien vers ceux-ci (au format pdf)
Rechercher et remplacer à l’aide de «RegEx» (1) 
FGI_4-07_f.pdf
Rechercher et remplacer à l’aide de «RegEx» (2) 
FGI_5-07_f.pdf

Je tiens aussi à fortement remercier
Laurent Tournier qui m'a donné pas mal de conseils et d'exemples... 


Ċ
Olivier Berquin,
28 sept. 2009 à 00:48
Comments