Grep et InDesign

Il y a quelques années, j’avais écrit une page consacrée à GREP et InDesign CS3 (ce devait être en 2008-2009). Je vous la poste ici, parce qu’elle est toujours d’actualité.

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

Un programme créé dans les années 70, 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

Les 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 (j’explique ici plus bas à quoi ils servent).

Ces caractères spéciaux ou métacaractères sont les suivants :
^ . $ * + ? | \ [ ] ( ) { }

Le \ est le caractère d’échappement.

Voici quelques codes à connaître

. 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, câble…
\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 après) (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 $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 mots composés. 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 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”)
\< 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.+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 (les guillemets ne sont pas sélectionnés !) Le +? représente la répétition “une ou plusieurs fois” (correspondance la plus courte).
Voici un exemple de la recherche (?<=").+?(?=")
Michel Galabru a dit en 2006 : “Il n’y a pas homme plus courageux au monde que celui qui réussit à s’arrêter après la première cacahuète!”.

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

Exemple de correspondance la plus courte :

Ce sont les diligences avec lesquelles le bateau à vapeur doit être en correspondance (Du Camp, Hollande, 1859, p. 218). Le métro marche encore, mais avertit les voyageurs qu’il ne garantit aucune correspondance (Gide, Journal, 1914, p. 453).

Dans ce paragraphe, si je désire mettre le texte qui est entre parenthèses en italique, je ne peux pas faire une recherche de \(.+\). Voici ce que cela donnerait:

Ce sont les diligences avec lesquelles le bateau à vapeur doit être en correspondance (Du Camp, Hollande, 1859, p. 218). Le métro marche encore, mais avertit les voyageurs qu’il ne garantit aucune correspondance (Gide, Journal, 1914, p. 453).

Je dois utiliser le grep suivant: \(.+?\)

Ce sont les diligences avec lesquelles le bateau à vapeur doit être en correspondance (Du Camp, Hollande, 1859, p. 218). Le métro marche encore, mais avertit les voyageurs qu’il ne garantit aucune correspondance (Gide, Journal, 1914, p. 453).


Documentation

Laurent Tournier a créé le site Indigrep. Il a également écrit un livre (qui est devenu un PDF): PDF GREP et InDesign CS3/CS4: Rechercher, remplacer et formater en un clic : 10 €. Je vous le recommande vivement !

Update (mars 2020)

Je vous recommande aussi le pdf en ligne « GREP in InDesign: An InDesignSecrets Guide » (édition mars 2019) de Peter Kahrel (14,05 €). 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) 68_RegExp1_f
Rechercher et remplacer à l’aide de « RegEx » (2) 69_RegExp2_f

Je tiens aussi à remercier Laurent Tournier qui m’a donné beaucoup de conseils et d’exemples…


9 Réponses à “Grep et InDesign”

  1. Bonjour,
    je dois monter un dico avec, en chaque début de paragraphe, un ou plusieurs mots dans un style autre que celui du texte qui suit. La groupe de mots débute donc en début de paragraphe et s’arrête juste avant une ouverture de parenthèse.
    Pour automatiser l’application de mon style de caractère, je voudrais créer un style Grep mais ne sais pas du tout comment faire. Est-ce que vous pourriez m’aider ?
    Merci beaucoup d’avance,
    Bärbel

  2. Bonjour BÄRBEL,
    dans ton style paragraphe / grep, tu ajoutes :
    tu sélectionnes ton style caractère puis dans la ligne grep :
    ^.+(?=\()

  3. Bonjour Bârbel et Jérôme,
    Dans ce cas, je préfère utiliser un style imbriqué.
    Dans la partie “Lettrines et styles imbriqués”, cliquez sur “Nouveau style imbriqué”, puis le nom du style de caractère, puis “jusqu’à”, puis 1 (

    Mais chacun fait comme il le sent, n’est-ce pas?
    Oli.

  4. Bonjour,
    merci pour ces explications. Je ne connaissais pas cette fonctionnalité.
    Néanmoins, je n’arrive pas à trouver la solution à mon problème.
    J’ai une Police dont je souhaite utiliser la variante du R majuscule sur tout le document. Le problème, c’est que cette variante fait partie d’un jeux stylistique OptenType prédéfinie, accompagnée de nombreuses autres variantes comme le A, M, W etc, que je ne souhaite surtout pas.
    Quelle solution pour activer, peut-être via les styles de paragraphes, seulement la variante R ? Je suis perdu

    1. Bonjour Anthony,
      Pouvez-vous m’envoyer un exemple? Un fichier idml avec un extrait du texte et tous les styles de paragraphe et de caractère?
      Je vous répondrai dans la semaine.
      Très bonne journée.
      O.

      1. Bonjour,
        je suis dans la même problématique, je dois utiliser la variante d’un “a” et d’un “l” d’une certaine typographie pour un manuel sur indesign. Savez vous comment je peux faire pour que mon style de paragraphe intègre ces variantes de glyphe en grep ?

        1. J’ai proposé à Julie de travailler avec des styles de caractères et un style Grep (dans le style de paragraphe).

  5. Bonjour,
    Comment, avec seule formule GREP, remplacer automatiquement la liste de mots suivants: Ecole par École, Eglise par Église, Evangile par Évangile, Etat par État,…?
    Merci beaucoup

    1. Bonjour,
      Vous pouvez essayer ceci:
      Rechercher: (?-i)E(cole|glise|vangile|tat)
      Remplacer: É$1
      (?-i) signifie “respect de la casse activée”

Laisser un commentaire