grep in Adobe InDesign

Ähnliche Dokumente
Schritt für Schritt Reguläre Ausdrücke verstehen. Einstieg in. Reguläre Ausdrücke. Michael Fitzgerald O REILLY. Übersetzung von Thomas Demmig

Einsatz und Verwendung von Formatierungszeichen

Reguläre Ausdrücke Suchmuster, Pattern Matching

Empfehlenswerte Referenzen

GREP. Reguläre Ausdrücke. GREP Hardcore. Syntax. Ersetzen Suchen. Look Around. 20. April 2012 Pubkon 2013

b{2} [^b]{2} Reguläre Ausdrücke als Hilfsmittel der Textanalyse Manuel Raaf Bayerische Akademie der Wissenschaften, IT-Referat

/ Vortrag Unix-AG

Regular Expressions. Daniel Lutz Was ist eine Regular Expression?

Reguläre Ausdrücke IDE AUTUMN SCHOOL

vi Navigieren & Bearbeiten

Word-Kurs. Word-Kurs weil auch die Form der Seminararbeit in die Note eingeht. Text schreiben: Word 2010: Registerband mit Registerkarten

weil auch die Form der Seminararbeit in die Note eingeht

Word-Kurs. Word-Kurs weil auch die Form der Seminararbeit in die Note eingeht. Seitenlayout. Word 2010: Registerband mit Registerkarten

Arbeiten mit Regulären Ausdrücken. Annette Gerstenberg Würzburg, 16. März 2016 Workshop "Digitale Methoden" beim Forum Junge Romanistik

Einführung in PERL 2 Reguläre Ausdrücke

Kopf-/Fußzeilen und Seitenzahlen

3 Regular expressions

41.2 LUA Grundlagen - Funktionen

4.5 Aufzählungen und Listen

Übersicht. Einführung in Perl Operatoren - Richtigstellung Mustersuche II. Richtigstellung Operatoren (2) Richtigstellung Operatoren (1)

Variablen, Konstanten und Datentypen

Überprüfen Sie Ihre erworbenen Fähigkeiten. Wenn Sie beide Übungen ohne Hilfe lösen, wechseln Sie zu den Lektionen des nächsten Kapitels.

Word Kurzübersicht

Last update: :39 hilfe:grundlagen

Gregor Fellenz. InDesign. automatisieren. Keine Angst vor Skripting, GREP & Co. dpunkt.verlag

Beispiel. Problem: mehrteilige Nachnamen (von Goethe, Mac Donald, Di Caprio)

Word. Verweise. Textmarken, Querverweise, Hyperlinks

Informationsextraktion Materialien zur Vorlesung

Dissertationen.dot. Dissertationen.dot Leitfaden für Autoren

Proseminar UNIX Tools. Ferdinand Beyer

OpenType Schriftarten. Windows. Will Software

Dateisystem 2, Suchen & Finden

ECDL EXCEL ... ADVANCED

Wie lege ich eine neue Standardseite an?

Kurzanleitung. Zitiertil-Creator. Dokumentvorlagen Dokumente Formatvorlagen Format Zeichen Format Absatz

05. übung. InDesign. medienwerkstatt // seite 1

Übungsblatt 1. Java Vorkurs (WS 2017)

Nervige Tastaturfunktionen einfach abschalten

denn sonst kann man gleich mit der Schreibmaschine schreiben

Zur Schreibweise der Angaben gelten folgende Regeln:

Lexikalische Struktur von Fortran 95. Normierte Zeichensätze

5. Die Open Office.org Writer-Hilfe Die Open Office.org Writer-Hilfe verwenden...45

Es gibt immer einen Schlüssel und einen zugehörigen Wert,

Wocheninfo auf der Webseite aktualisieren

Nützliche Tastenkombinationen (Word)

Reguläre Ausdrücke mit Java

Word 10. Verweise: Textmarken, Hyperlinks, Querverweise Version: Relevant für:

Word 2016: Tastenkombinationen

Die Gruppe Funktionsbibliothek

Datenbank und Tabelle mit SQL erstellen

13.2 Problematische Zeichen prüfen

Mit Formatierungszeichen arbeiten

Webengineering. Reguläre Ausdrücke. Dienstag, 2. Juli 13

Dateisystem 1, Suchen & Finden

Schriftbild. STRG + UMSCHALT + * Nichdruckbare Zeichen anzeigen

C. Ortseifen: Reguläre Ausdrücke

Tastenkürzel für WORD. F4 oder Strg + Y oder Alt + Enter

Programmierkurs C++ Variablen und Datentypen

3 Text markieren PROJEKT. Word Markieren mit der Maus. Markieren mit der Tastatur. Markieren mit der Erweiterungstaste.

Word 10. Verweise Version: Relevant für: IKA, DA

INHALTSVERZEICHNIS. Vorwort Die Arbeitsumgebung von Word Word-Dokumente verwalten Texteingabe und Textkorrektur 30

Das hitcom Shortcut-ABC. Tipps, Tricks und viele hilfreiche Ratschläge

Perl Regular Expressions in Base SAS

Python Variablen und Anweisungen

Einstieg in die Informatik mit Java

Nützliche Tastenkombinationen

Abfragen mit Platzhaltern

Word starten. Word Word 2010 starten. Schritt 1

Um Zellformatierung aufzurufen wählen Sie Register START / und anschließend die jeweiligen Gruppen-Dialoge oder gleich die Tastenkombination +.

Word für Windows 2010

5 Grundlagen der Java-Syntax

Tag 2 Repetitorium Informatik (Java)

1.1 Verwendung der Funktionen

Effizienter Arbeiten mit InDesign: Praktische Tipps und Tricks. Pascal Schrafl, JetNet Services GmbH Digicomp Publishing Day

3. Nummerierung von Überschriften

Xpert - Europäischer ComputerPass. Peter Wies. Tabellenkalkulation (mit Excel 2010) 1. Ausgabe, 5. Aktualisierung, Juli 2013

Regular expressions for pros Reguläre Ausdrücke für Fortgeschrittene (Perl) Elena Neuburg

Hallo Haskell. Funktionale Programmierung. Prof. Dr. Oliver Braun Letzte Änderung: :06. Hallo Haskell 1/23

Reguläre Ausdrücke. Reguläre Ausdrücke = Regular Expressions = reg.exp./regexp/regexp = RE

Inhaltsverzeichnis(se) erstellen

Handreichungen zu O-Konv

Auszug aus dem Buch»Adobe InDesign CS3 - Das Nachschlagewerk für Fortgeschrittene«

Hochschule Aalen. Word. Formatvorlagen und mehr

Absätze ausrichten. Word Text eingeben: Aufgabe: Schritt 1. Schritt 2

Wasser da$ \sie Ö{se. Maße hei# Schluss-$: $ an Stelle des $ kurzer Anstrich für \s: \ an Stelle des \ langer Anstrich für {s: { an Stelle des {

ICT Smart-User SIZ SU3 Texte. mit Word Thomas Alker, Ortrun Grill. 1. Ausgabe, April 2017 ISBN

Menü Bearbeiten. Rückgängig

Layout für einen Zeitungsartikel

Python für Linguisten

Objekte haben eine eigene Notation, also Schreibweise, beim Aufruf:

Word Kapitel 12 Lernzielkontrolle Word 2010 Beantworten Sie die folgenden 12 Fragen

Ihr PC - Arbeitsplatz

Transkript:

grep in Adobe InDesign Kurs 2, Version CS5 Kursleiter: Serge Paulus Unterlagen Version 2 vom Juni 2011

grep in Adobe InDesign Kurs 2, Version CS5 2

grep in InDesign grep in InDesign Es gibt mehrere Implementierungen von grep, die teilweise Unterschiede in der Syntax der Regex aufweisen. Die Unterschiede sind üblicherweise nicht sehr groß, es kann trotzdem vorkommen, dass eine (komplexe) Regex nicht allgemein verwendbar ist. In diesem Kurs wollen wir die Implementierung in Adobe InDesign betrachten, ebenso wie deren Einsatzmöglichkeiten beim Arbeiten mit Texten. InDesign kennt grep ab der Version CS2, hier findet man in dem Dialogfeld Suchen/Ersetzen den Karteireiter grep. In Version CS4 gibt es eine erweiterte Möglichkeit der Verwendung von grep in Absatzformaten, hier finden sich die Einstellungen im Dialogfeld Absatzformatoptionen» GREP-Stil. Mit Hilfe dieser Einstellungen lassen sich dynamische Formatierungen in einem Absatzformat durchführen. Ersetzungen lassen sich hier allerdings nicht durchführen, dies funktioniert nur in dem Suchen/Ersetzen Dialogfeld. Ein kurzer grep-primer Die folgende Tabelle fasst das Grundvokabular von Regex zusammen: Ausdruck Gesucht wird... String Wort String (Case sensitiv, d.h string wird nicht gefunden). [abc] gesuchtes Zeichen entspricht einem der Zeichen a,b oder c [a-d] gesuchtes Zeichen liegt zwischen a und d, der Ausdruck findet demnach a, b, c oder d. Groß und Kleinschreibung wird berücksichtigt. [0-6] beliebige Ziffer zwischen 0 und 6, findet denmach 1, 2, 3, 4, 5 oder 6. [^abc] alle Zeichen außer den angegebenen Zeichen ( ^ negiert also die Suchausdrücke), der Ausdruck findet z.b. x oder 9, aber kein a. [abc^] Achtung: die Negation ist nur wirksam als erstes Zeichen in der Klammer: hier werden die Kleinbuchstaben a, b, c oder das Zeichen ^ gesucht Steuerzeichen \t Tabulator \n einen harten Zeilenumbruch (in InDesign mit Alt-Return erzeugbar) \r Wagenrücklauf (carriage return) entspricht dem Absatzende in InDesign Metazeichen. beliebiges Zeichen \l beliebiger Kleinbuchstabe (lower case) \u beliebiger Großbuchstabe (upper case) \l\u beliebiger Buchstabe \d beliebige Ziffer \D beliebiges Zeichen außer Ziffern 3

grep in Adobe InDesign Kurs 2, Version CS5 Ausdruck Gesucht wird... \w beliebiges Zeichen (Buchstabe oder Ziffer) \W beliebiges Zeichen außer Buchstaben oder Ziffern \s beliebiges Leerzeichen (auch Tabulator) \S beliebiges Nicht-Leerzeichen \ Backslash, nötig, wenn zum Beispiel nach dem Zeichen + gesucht werden soll (verhindet den Aufruf als Operator) \+ sucht nach einem +, nicht nach ein oder mehreren \. Zähler? kein oder einmaliges Vorkommen des vorhergehenden Zeichens. + vorhergehendes Zeichen kommt mindestens einmal vor. Ergibt immer die maximal mögliche Länge eines gefundenen Bereiches (greedy). +? vorhergehendes Zeichen kommt mindestens einmal vor, sucht aber nicht die maximal mögliche Länge. (non-greedy) * vorhergehendes Zeichen kommt beliebig oft vor. Kann auch gar nicht vorkommen (fakultatives Zeichen). {x} vorhergehendes Zeichen/Gruppe genau x-mal hintereinander {x,y} vorhergehendes Zeichen/Gruppe x bis y-mal hintereinander {x,} vorhergehendes Zeichen/Gruppe mindestens x-mal hintereinander Positionen ^ Absatz- oder Zeilenanfang (je nachdem, ob im Ein-Zeilen-Modus oder nicht.) Standard ist Absatzanfang in InDesign. $ Absatz- oder Zeilenende. Standard: Absatzende. \< Wortanfang \> Wortende \b Wortgrenze (Anfang oder Ende) \B Nicht-Wortgrenze Gruppen: () Gruppe von Ausdrücken $x Referenz auf Gruppe. bei (a)(b)(c) verweist z.b. $2 auf die Gruppe (b). Die Referenzen funktionieren nur im Ersetzen-Feld von InDesign. Logisches Oder (also x y = entweder x oder y) Look-Around (?=X) Positiver Look-Ahead: Der Ausdruck X muss auf den vorgenannten Ausdruck folgen. X gehört dabei nicht zum ausgewählten Bereich. (?!X) Negativer Look-Ahead: Der Ausdruck X darf nicht auf den vorgenannten Ausdruck folgen 4

grep in InDesign Ausdruck (?<=X) (?<!X) Verhalten von grep (?i) (?m) (?s) (?x) Gesucht wird... Positiver Look-Behind: Der Ausdruck X muss dem folgenden Ausdruck vorangehen Negativer Look-Behind: Der Ausdruck X darf nicht dem folgenden Ausdruck vorangehen Dieser Ausdruck am Anfang des Regex schaltet grep auf case-insensitive um. Groß- und Kleinschreibung werden damit ignoriert. (?-i) schaltet auf case-sensitive. Standardeinstellung ist case-sensitive Multi-Line Mode. Das Regex arbeitet über mehrere Zeilen hinweg. Dies ist in InDesig Standardeinstellung, ^ findet den Absatzbeginn, $ das Absatzende. Single Line Mode. Es wird immer nur eine Zeile betrachtet, ^ findet damit den Beginn einer Zeile, $ das Ende der Zeile. Damit findet die Regex aber keine Textstellen, die über eine Zeile hinwegreichen. Ignoriert alle Leerzeichen im Regex. Damit kann die Regex besser lesbar werden. Aus Übersichtsgründen wurde die obige Tabelle auf das Wesentliche reduziert. Für weitere Möglichkeiten von grep in InDesign konsultiere man bitte entsprechende Fachliteratur(1). Um dieses Vokabular klarer erscheinen zu lassen, können wir uns ein paar einfache Beispiele ansehen. Die folgende Tabelle zeigt exemplarisch einige Regex und den Text, den diese finden können: Regex iphone i\u\l+ gefundener Text findet den Text iphone, aber kein Iphone. findet alle Wörter, deren erster Buchstabe ein kleines i ist, gefolgt von einem Großbuchstaben und einem oder mehreren Kleinbuchstaben. Gefunden wird: iphone, ipad, ipod, aber nicht ipad, IPAD. Findet ebenfalls Teile von einem Wort, so z.b. ipad in ipadapp (1) P. Kahrel 2009: GREP in InDesign CS3/4. O Reilly Media Inc. ISBN: 9780596008. http://oreilly.com/catalog/9780596557348/ Es gibt ansonsten noch eine Reihe von Publikationen, die sich ausschließlich mit grep befassen. 5

grep in Adobe InDesign Kurs 2, Version CS5 Regex i?\u\l+ \d+ \d{1,3}\. (\d{1,3}\.){3)\d{1,3} ^\l+ \d+$ P(a o)d (Apfel Kirsch)(torte kuchen) \bapfel\b (\d+),(\d+) gefundener Text Dieses Regex findet alle Wörter, die mit mindestens einem kleinen i beginnen, dann ein Großbuchstabe und eins oder mehrere Kleinbuchstaben enthält. Findet also: ipad, aber auch Pad. Findet ebenfalls ipad in ipadapp, aber auch Reg und Ex in RegEx. findet eine Zahlenreihe. Dabei werden immer die maximal möglichen Zahlenreihen gefunden, bei 12345 wird also immmer 12345 gefunden. \d+? findet auch 1, 2, 12, 123 usw. Findet eine Zahl mit 1 bis 3 Stellen und einem Punkt dahinter. Der Punkt ist ein Platzhalter im Regex, will man also einen. finden, muss man ihn mit einem vorangestellten \ als literal character markieren. Dies gilt ebenfalls für alle anderen Steuerzeichen, auch dem \ selbst. Ein \\ findet demnach das Zeichen \ Findet eine IP-Adresse (drei mal ( ){3} Zahlen zwischen eins und drei Stellen \d{1,3} mit einem Punkt \. dahinter, dann noch eine Zahl zwischen eins und drei Stellen), z.b. 134.2.200.1, aber nicht 1342.2.200.1. Findet alle Wörter am Beginn eines Absatzes ^, die nur aus Kleinbuchstaben \l+ bestehen. Findet alle Zahlen am Ende eines Absatzes. Findet Pad oder Pod aber kein Pid. Findet ebenfalls das Pad oder Pod in ipad und ipod Findet Apfelkuchen, Apfeltorte, Kirschkuchen und Kirschtorte. Findet aber keine Sahnekirschtorte Findet nur das Wort Apfel, aber nicht Apfelkuchen. \b als Wortgrenze kann ein Leerzeichen sein, aber auch ein Anführungszeichen, sprich InDesign findet den Apfel auch in Apfel oder»apfel«. Findet eine beliebige Dezimalzahl mit Komma als Trenner. Die Besonderheit in diesem Regex sind die Gruppen. Mit den Gruppen kann man beim Ersetzen eine Referenz zu dem gefundenen Bereich erhalten. Als Beispiel haben wir die Zahl 3,1415 gefunden. $0 ergibt jetzt den ganzen gefundenen Text 3,1415, $1 die erste Gruppe 3, $2 die zweite Gruppe 1415 6

grep in InDesign Regex Ersetze mit $1.$2 (?<=(Adobe\s))InDesign gefundener Text Aus dem vorigen Beispiel: Ersetzt meine gefundene Zahl 3,1415 mit 3.1415 ($1 ergibt 3, dann der Punkt, dann $2= 1415. Ohne Gruppen im Suchfeld ersetzt InDesign hier $1.$2 Findet Indesign im Text dieses Programm heißt Adobe InDesign CS5, aber nicht in Das Programm InDesign CS5, da hier Adobe mit folgendem Leerzeichen nicht davor steht. Wollen wir InDesign ohne voranstehendem Adobe finden, lautet die Regex (?<!(Adobe\s))InDesign Look-Ahead und Look-Behind dürfen gerne kombiniert werden, wenn man beispielsweise InDesign nur mit voranstehendem Adobe und nachfolgenden CS5 finden möchte: (?<=(Adobe\s))InDesign(?=(\sCS5)) Bevor wir uns jetzt mit diversen Beispielen vertraut machen wollen, sollten wir einge Grundregeln beim Arbeiten mit grep unter InDesign beachten: Bitte speichern Sie ihr Dokument vorher. Ein Alles Ändern ist schnell gedrückt, alle Änderungen wieder rückgängig machen dauert meist deutlich länger. Testen Sie ihr Regex vorher, bevor Sie es auf ihr Dokument loslassen. Viele Stolperfallen werden so entdeckt, bevor man z.b. seine Dissertation versaut. Versuchen Sie am Anfang nicht, alle Probleme mit einem Regex zu lösen. Mehrere Suchläufe hintereinander reduzieren sehr oft die Komplexität des Regex deutlich. Beispiel 1: Hexadezimale Zahlen Hexadezimale Zahlen bestehen aus den Zahlen 0 bis 9 und den Buchstaben A bis F. Es ist hier irrelevant, ob A bis F groß oder kleingeschrieben wird. Grep-Suchen in InDesign sind standardmäßig case-sensitive, Groß- und Kleinschreibung wird demnach respektiert. Die Datei Color Codes.inx enthält eine Liste von Farbnamen mit den entsprechenden Werten im Hexadezimal- und im Dezimalformat. Wir wollen die Hexadezimalwerte mit einem schon vorbereitetem Zeichenformat hervorheben, die Dezimalwerte sollen allerdings nicht verändert werden. Einfach nach passenden Zahlen mit 2 Stellen \d{2} suchen reicht hier also nicht, da eventuell Zahlen im Dezimalformat ebenfalls mit einbezogen werden, davon mal abgesehen, dass \d sowieso die Zeichen A bis F nicht findet. 7

grep in Adobe InDesign Kurs 2, Version CS5 Die Suche nach einer hexadezimalen Ziffer braucht deswegen eine Angabe wie [1234567890ABCDEFabcdef] oder einfacher [0-9a-fA-F] geschrieben. Wir wollen zwei Ziffern hintereinander finden, daher [0-9a-fA-F]{2}. Leider findet diese Regex aber auch Dezimalzahlen, die zweistellig sind. Das Kriterium, dass ein Buchstabe drin sein muss, funktioniert ebenfalls nicht, da 26 sowohl eine korrekte hexadezimale wie auch eine korrekte Dezimalzahl darstellt. Netterweise sind die Hexadezimalwerte aber immer in Dreiergruppen mit einem Leerzeichen getrennt geschrieben, so dass wir dies ausnutzen können. [0-9a-fA-F]{2}\s[0-9a-fA-F]{2}\s[0-9a-fA-F]{2} sollte das Problem lösen. Beim Probieren stellt sich aber heraus, dass dies leider aber nur teilweise funktioniert. Dieses Problem haben wir uns aber hier in diesem Fall selbst geschaffen. Da wir eine möglichst flexible Suche nach Hexadezimalzahlen haben wollten, wurden die Kleinbuchstaben mit eingebunden. Leider findet das erste [0-9a-fA-F]{2} aber beispielsweise ebenfalls ed aus red und der Tabulator dahinter wird als Leerzeichen interpretiert, damit werden die zwei letzten Hexadezimalzeichen nicht mehr berücksichtigt. Da wir aber immer den Tabulator vor der ersten Hexadezimalzahl haben, können wir einfach ein \s vor unser Regex setzen, ed aus Red wird dann nicht mehr gefunden. Damit haben wir das gleiche Muster jeweils drei mal hintereinander. Das kann man dann mit einer Gruppe folgendermaßen abkürzen: (\s[0-9a-fa-f]{2}){3}. Wir kommen später noch einmal auf dieses Beispiel zurück, dann versuchen wir, die Hexadezimalzeichen mit Suchen/Ersetzen umzuformatieren. Beispiel 2: Suche nach negativen Zahlen Ein Beispiel: wir wollen eine Liste mit positiven und negativen Zahlen so formatieren, dass die negativen Zahlen rot werden und die positiven grün. Als Voraussetzung brauchen wir passende Absatz- und Zeichenformate, die das Aussehen unseres Textes kontrollieren. In CS4 und später können wir den GREP-Stil in den Absatzformatoptionen verwenden, in CS3 müssen wir die Ersetzungen jedoch per Hand durchführen. Aufbau der Regex: Eine beliebige zusammenhängende Zahl findet man über \d+. Negative Zahlen findet man demnach mit -\d+. Bei positiven Zahlen ist dies nicht ganz so einfach: erstens ist das + ein Spezialzeichen im Regex, deshalb muss es mit einem Backslash versehen werden. Unser Regex sähe demnach so aus: \+\d+ Andererseits muss bei positiven Zahlen gar kein Vorzeichen davor stehen, es kommen also auch Zahlen wie 1234 in Frage. Ein einfaches \d+ wird nicht funktionieren, da dies auch auf die negativen Zahlen passt. Mit \+\d+ bekommen wir nur die Zahlen mit einem + davor. Je nach Position muss die Regex angepast werden. Wir könnten alle Zahlen mit keinem - davor finden, diese Strategie hat aber leider einen Haken: das Minus kann man mit [^-] ausschließen, 8

grep in InDesign aber die Regex [^-]\d+ findet in -2345 leider auch 345, da vor der 3 ja kein Minus steht. Eine weitere Methode wäre, alle Zahlen mit einem + und einem Leerzeichen davor zu finden, [\+\s]\ d+ aber findet keine Zahl, die am Anfang eines Absatzes steht. Damit könnte man leben, wenn denn in unserem Text keine Zahl am Anfang eines Absatzes steht. Man könnte natürlich einen weiteren Grep-Stil anlegen, der genau dieses Szenario abdeckt und der alle Zahlen sucht, die am Beginn des Absatzes stehen: ^\d+. Es gibt natürlich eine Lösung, die hier passt, aber diese braucht ein sogenanntes negative Lookbehind : (?<!(- \d))\+*\d+ (wir suchen hier eine Zahl, wo kein Minus oder keine weitere Ziffer (- \d) davorsteht (?<! ), dann ein fakultatives Plus \+* vor der Zahl \d+ steht). Lookahead und Lookbehind werden wir in einer späteren Übung noch betrachten. Beispiel 3: Suchen und Ersetzen mit grep Kommen wir zurück auf die erste Übung, hier wollen wir die vorhin gefundenen Hexadezimalzahlen anders formatiert haben. Dies läßt sich über das Suchen/Ersetzen Dialogfeld erledigen. Dabei nutzen wir die Fähigkeit von grep, mit dem gefundenen Text den Ersatztext zu erstellen. Hierzu werden die Platzhalter $0 bis $9 im Ersetzen-Feld genutzt. Platzhalter $0 steht dabei für den gesamten gefundenen Text, $1 für die erste gefundene Gruppe, $2 für die zweite usw. Das richtige Aufteilen des Regex in Gruppen ist damit natürlich sehr wichtig geworden. In der vorigen Übung haben wir als Regex folgendes aufgebaut: (\s[0-9a-f]{2}){3}. Dieser Ausdruck enthält schon eine Gruppe (die Klammern zeigen diese an, in dem Fall für die Wiederholung), $1 enthält hier dann aber nur die letzte gefundene Gruppe (sprich die letzte der drei Hexadezimalzahlen), damit kommen wir leider nicht weit. Wir müssen die Gruppen so verteilen, dass wir mit den Platzhaltern problemlos darauf zugreifen können. Damit fallen Wiederholungen von Gruppen leider aus, die Regex muss wieder explizit alle Zahlen einzeln enthalten: \s([0-9a-f]{2})\s([0-9a-f]{2})\s([0-9a-f]{2}). Die erste Klammer ($1) liefert dann die erste der drei Hexadezimalzahlen, $2 die zweite usw. Wollen wir das besonders elegant lösen, so können wir die Leerzeichen (\s) ebenfalls in Klammern setzen, damit wir über die Platzhalter einen Tabulator, ein nichtumbrechendes Leerzeichen oder ein normales Leerzeichen ersetzen können: (\s)([0-9a-f]{2})(\s)([0-9a-f]{2})(\s)([0-9a-f]{2}). Jetzt liefert $1 das erste Leerzeichen (den Tab.), $2 die erste Zahl, $3 das Leerzeichen dazwischen usw. (\s)([0-9a-f]{2})(\s)([0-9a-f]{2})(\s)([0-9a-f]{2}) $1 $2 $3 $4 $5 $6 Wenn wir nun eine Formatierung der Hexadezimalzeichen wie &x0abc9f haben wollen, brauchen wir natürlich erst das erste Leerzeichen (der Tab soll ja nicht weg), dann &x, dann die 9

grep in Adobe InDesign Kurs 2, Version CS5 drei Zahlen, in Regex: $1&x$2$4$6. Dies wird als Ersetzungsmuster eingefügt, Alles Ändern formatiert dann alle Hexadezimalzahlen passend um (vorher sollte man das aber testen). Beispiel 4: Umformatieren von Telefonnummern Die Datei Telefonliste.inx enthält eine Liste von Kontaktdaten diverser Firmen. Diese Liste könnte beispielsweise direkt aus einer Datenbank heraus generiert werden, allerdings haben wir hier das Problem, dass die diversen Angaben leider in unterschiedlichen Formaten stehen. In der Datei sind z.b. die Ländervorwahlen in zwei verschiedenen Schreibweisen angegeben, einmal mit einem + davor (+49) und einmal mit der doppelten Null (0049). Wir wollen beide aneinander angleichen, dabei soll die Ländervorwahl in Klammern gesetzt werden. Die Aufgabe ist relativ einfach, wenn man die einzelnen Fragen in mehrere Schritte aufteilt. Unser Regex soll aber alles auf einmal machen. In anderen Worten, wir suchen nach 2 bis 3 Zahlen mit 2 voranstehenden Nullen (00\d{2,3}) oder einem + (\+\d{2,3}) und ersetzen diese mit entsprechenden Klammern, dem + und den gefundenen Zahlen. Betrachtet man die Telefonnummern, so kann es durchaus vorkommen, dass die beiden Nullen auch mitten in der Nummer vorkommen. Wir müssen also klar stellen, dass dies nur am Anfang einer Nummer passiert (üblicherweise steht ein Tabulator davor). Natürlich kann man jetzt ebenfalls den Tabulator vorher mit in die Regex einbinden und in der Ersetzung einfach ein Tabulator mit vorne dranhängen, alternativ kann man hier eine Kondition vor die Regex stellen: das Look-Behind. Wir wollen nur, dass die Regex passt, wenn ein Tabulator davorsteht ((?<=\t)). Bemerkung: Das Dokument ist hier etwas ärgerlich, denn nicht vor allen Telefonnummern steht ein Tabulator, bei einigen steht ein Tabulator mit nachfolgendem Leerzeichen. Wir können dies mit in die Regex (ein oder kein Leerzeichen) einbinden: \s?). Die Regex würde damit jetzt wie folgt aussehen: (?<=(\t))\s?(00 \+)(\d{2,3}). Die Gruppen sind nun so gesetzt, dass man per Referenzen im Ersetzen-String darauf zurückgreifen kann. Man teste dies natürlich erst mal, bevor man eine Ersetzung durchführt. Nach erfolgreichem Suchtest geht es nun um das Ersetzen. Das Leerzeichen nach dem Tab wollen wir fallenlassen, weshalb es im Regex auch nicht geklammert wurde. Dann wollen wir die Gruppe ((00 \+)) durch ein + ersetzen, danach kommt dann die Gruppe der Zahlen (\d{2,3}). Drumherum sollen ein Paar Klammern stehen: (+$3). Die Zahl der korrekten Gruppe kann man per Zählen herausfinden: (\t) ist die erste, (00 \+) die zweite, (\d{2,3}) die dritte Gruppe, alternativ geht natürlich auch Trial and Error. Das Beispieldokument ist so natürlich noch nicht druckfähig, einige Details benötigen noch etwas Aufmerksamkeit, aber dies ist mit grep recht einfach lösbar. 10

grep in InDesign Beispiel 5: Hervorheben von URL Alle kennen die nervige Angewohnheit von Word, einen Link zu unterstreichen und blau einzufärben, sobald man etwas tippt, das nur annähernd nach einem Link aussieht. InDesign macht dies nicht, aber wir können mit Hilfe von grep und den grep-formaten in den Absatzformatoptionen diese Funktionalität leicht selbst nachrüsten, wenn man sie denn braucht. Wie erkennt man einen URL? Üblicherweise beginnt der URL mit http://, es gibt aber durchaus noch andere Formen, wie beispielsweise ftp, feed, usw. Innerhalb des URL dürfen nur gewisse Zeichen auftreten, so beispielsweise Buchstaben, Zahlen, ein Strich, ein Unterstrich, ein Slash, ein Punkt, aber keine Leerzeichen. Üblicherweise enden Hypertext Links mit.htm oder.html, da wir aber besonders flexibel bleiben wollen (URL mit ftp müssen das eben gerade nicht), wäre diese Kondition eher störend. Bauen wir unser Regex also erst mal auf: (http ftp feed)://[-a-za-z0-9/_\.]+ Dies sollte beim ersten Zeichen, das nicht in der spitzen Klammer aufgezählt ist, die Auswahl stoppen, da dies dann kein korrekter URL mehr wäre. Man beachte das - direkt am Anfang der spitzen Klammer, dies steht explizit für das Zeichen -, während das gleiche Zeichen weiter innerhalb der Klammer als Bereichsangabe zu verstehen ist (a-z bedeutet a bis z). Bemerkung: Neuerdings sind auch Umlaute wie ä, è und ß erlaubt, unsere Regel hier würde die jetzt nicht zulassen. Eine mögliche Lösung: es gibt in InDesign ein weiteres Metazeichen \X, das auf jedes Zeichen mit einem nachfolgenden diakritischen Zeichen passt (z.b. n~, u ). Am einfachsten jedoch ist es, die Metazeichen \u und \l zu benutzen, da diese die Umlaute ebenfalls mit einschließen. Demnach müßte unser Regex folgendermaßen aufgebaut werden: (http ftp feed)://[-/_\.\u\l\d]+ Um das ganze jetzt perfekt zu machen, können wir natürlich auch darauf achten, dass vor dem URL eine Wortgrenze \b ist, nicht das abchttp:// ebenfalls einen Link ergibt, das ist aber natürlich Unsinn. Dann brauchen wir ab Version CS4 dies nur noch als grep-stil mit passendem Zeichenformat anlegen, und schon bekommen wir alle Links markiert (aber nicht als realen Link, das geht automatisiert nur per Skript). In diesem Zusammenhang sollte man noch auf das Metazeichen ~c verweisen. Dieses funktioniert nur innerhalb des Ersetzen-Feldes des Suchen/Ersetzen-Dialogfeldes und soll den Inhalt von der Zwischenablage an entsprechender Stelle einfügen. Dies funktioniert sogar mit Bildern, die in der Zwischenablage liegen. Möchte man z.b. vor jeden URL ein Bild einfügen, muss man das Bild in InDesign platzieren, es in die Zwischenablage kopieren und dann im Ersetzen- Feld folgendes eingeben: ~c $0. Dies fügt an der gefundenen Stelle erst das Bild aus der 11

grep in Adobe InDesign Kurs 2, Version CS5 Zwischenablage ein, dann ein Leerzeichen, dann den (gesamten) gefundenen Text. Dies funktioniert nicht mit einem grep-stil. Das Suchen nach email-adressen ist ähnlich, wird hier aber nicht explizit erklärt. Das dürft ihr jetzt gerne selbst ausprobieren. 12