grep – Notizen zum IDUG Vortrag

Am 30.1.19 bin ich bei der IDUG Hannover eingeladen, ein bischen was über grep zu erzählen.

Also dachte ich, packe ich meine Notizen mal hier her, vielleicht findet die noch jemand anderes interessant…

Wildcards

Windows Anwender kennen Wildcards von Angaben wie *.pdf, also etwa: „Nimm alle Dateinamen, die mit ‚.pdf‘ enden“.

Grep hat eine ziemliche Fülle von Wildcards:

Wildcard Bedeutung
. Ein Punkt steht für ein beliebiges Zeichen, außer einer Absatzschaltung \r
\d Eine Ziffer. Kann man auch [0-9] schreiben, siehe unten
\w Ein Buchstabe, wie er in einem Wort vorkommt. Hier sollte man wissen, dass grep aus der Unix-Programmierer-Umgebung kommt. Ziffern und Unterstriche gehören da also auch zu.
\u Ein Großbuchstabe
\l Ein Kleinbuchstabe
\s Alle Arten von Leerzeichen
\S Alles, was kein Leerzeichen ist.
[xya-f] Jedes Zeichen, das in der Klammer aufgeführt ist. Hier also: Entweder x oder y oder eins der Zeichen zwischen a und f
[^xyz] Alle Zeichen, die nicht in der Klammer aufgeführt sind, hier also auch X, Y oder Z (ie. Großbuchstaben)

Optionales und Wiederholung

Viele Suchsituationen werden durch ein „kann sein, kann aber auch nicht sein“ erschwert. Wurde die Telefonnummer mit Leerzeichen geschrieben oder als ununterbrochene Ziffernfolge? Wer weiß?

Wildcard Bedeutung
Th?orsten Das h ist optional, ‚Torsten‘ würde also auch gefunden werden
Max|Moritz Das | ist ein ODER. Hier findet sich also Max oder Moritz.
hm+ Das + bedeutet: mindestens 1 Zeichen, aber auch beliebig viele. Hier: hm oder hmmm oder hmmmmmmmmm, aber nicht h
„.*“ * ist „Keine oder mehrere“. Hier findet sich also: „“ oder „a“ oder „abc“
\d{2,4} von-bis Elemente. Hier: 2 oder 3 oder 4 Ziffern hintereinander
\d+(,\d{2})? Man kann Teilausdrücke klammern. Hier: sowohl 3 als auch 3,14. Von 3,141529 aber nur der Teil 3,14 wegen des {2} im Suchbegriff

Reservierte Zeichen

Wie man sieht, haben einige Zeichen in grep eine besondere Bedeutung, nämlich diese hier:
. ? ( ) [ \ ^ $ | + *

Wenn Sie eines dieser Zeichen selbst suchen wollen, müssen sie es „escapen“, sprich ein \ davor setzen. (Alt-Shift 7 auf dem Mac, Alt-GR ß unter Windows)

\. findet einen Punkt. \\ einen Backslash.

Diese Regeln gelten nicht innerhalb einer Zeichenmenge: [-+*/|]

Position

Häufig muss eine Suche eingeschränkt werden: Ich suche eine Zahl, aber nur, wenn der Absatz damit anfängt.

Wildcard Bedeutung
^\d+ ^ heißt: Absatz fängt damit an, hier: mit einer Zahl.
[^.!?]$ $ heißt: Absatz hört damit auf, hier: nicht mit einem . oder einem ! oder einem ?
\bA\w+\b Wortanfang oder -ende. Hier also: Alle Wörter, die mit einem A anfangen
[0-9,]+(?=/) (?= ) ist ein „Lookahead“. Hier: Eine Zahl direkt vor einem /, aber ohne das / selbst
(?<=/)\d+ (?<= ) ist ein "Lookbehind". Hier: Eine Zahl direkt nach einem /, aber ohne das / selbst.
Das kann in neueren InDesign-Versionen auch als /\K\d+ geschrieben werden.

Teilausdrücke speichern

grep kann sich „merken“, was es gefunden hat, so dass Sie das im Suchbegriff selbst oder beim Ersetzen wieder verwenden können. Dazu müssen diese Teile des Suchbegriffs geklammert werden.

\b(\w+)\b \1

Das findet doppelte Wörter. \b\w+\b ist komplettes Wort. \1 ist das, was in der ersten Klammer gefunden wurde.

Angenommen, Sie haben eine Namensliste.

Suche: (\w+) (\w+) und ersetze: $2, $1 macht auch „Max Muster“ den Eintrag „Muster, Max“.

Bei „Karl Heinz König-Wupperburg“ müsste man sich mehr Mühe geben 😉

Tools

Hinweis auf ein paar Scripte und Ressourcen.

FindChangeByList

In InDesign selbst ist ein Script von Haus aus installiert, mit dem man Such/Ersetzvorgänge automatisieren kann.

FindChangeByList in der Script-Palette

Neben dem Script sehen Sie einen Ordner. Mit der rechten Maustaste können Sie sich den im Finder/Explorer anzeigen lassen. In dem Ordner ist eine Textdatei, die Sie ändern können.

...
//
//{findWhat:"\\s+"}
//
grep	{findWhat:"  +"}	{changeTo:" "}	{includeFootnotes:true, includeMasterPages:true, includeHiddenLayers:true, wholeWord:false}	Find all double spaces and replace with single spaces.
grep	{findWhat:"\r "}	{changeTo:"\r"}	{includeFootnotes:true, includeMasterPages:true, includeHiddenLayers:true, wholeWord:false}	Find all returns followed by a space And replace with single returns.
...

Jede Zeile, die mit // anfängt, ist nur ein Kommentar.

Alle anderen beschreiben einen Suchen/Ersetzen Vorgang. Die Parameter sind durch Tabs getrennt und haben diese Bedeutung:

Position Bedeutung
1. Spalte grep oder text – Wie soll gesucht werden?
2. Spalte Parameter für die Suche. Meistens wird nur „findWhat“ gesetzt, aber Sie könnten auch z.B. nach dem zugewiesenen Zeichenformat suchen: { findWhat: "\d", appliedCharacterStyle: "zahl"}
2. Spalte
3. Spalte Wogegen soll ersetzt werden. Analog zur 2. Spalte
4. Spalte Das entspricht den kleinen Icons im Such-Dialogfeld
5. Spalte Ein Kommentar

Peter Kahrels grep Tools

Peter Kahrel ist ein bekannter InDesign-Scripter (und Setzer), der in England lebt und vor allem zur Automatisierung von Textsatz sehr viele sehr gute Hinweise veröffentlicht hat.

Zum Thema grep hat er eine ganze Reihe von Scripten auf seiner Webseite, von denen ich Ihnen vor allem den Grep Editor ans Herz legen möchte.

Peter Kahrels Grep Editor

Nicht nur haben Sie ein vernünftig großes Eingabefeld, um Ihre greps zu entwerfen, das Script zeigt auch noch on-the-fly im Hintergrund an, welche Texte mit Ihrem grep gefunden werden.
Das macht das Debuggen komplizierter Ausdrücke deutlich einfacher.