Hallo Werek
Freut mich, dass der Grep auch auf deinem Computer funktioniert.
Inzwischen ist mir noch eine Lösung eingefallen, wie alle Adressblöcke ohne die Zeile «Germany» direkt ausgewählt (und gelöscht) werden können. Wir suchen also nicht die Textblöcke mit «Germany», sondern genau umgekehrt.
Die Grep-Suche lautet folgendermassen:
(?<=\r\r)((.+\r)(?!Germany *\r))+\r\r
(Ersetzen durch: Nichts)
Kernstück ist der Ausdruck ((.+\r)(?!Germany *\r))+
Interessant daran ist, dass im Grep ein Lookaround (hier neg. Lookahead) ebenfalls wiederholt wird (+), das heisst wir suchen mehrere Absätze (.+\r), denen jeweils kein «Germany» folgt, und zwar alle zwischen zwei Leerzeilen (\r\r). Kleine Einschränkungen gibt es: So müssen auch am Anfang und Ende des Textabschnittes zwei Leerzeilen (Absatzmarken \r) stehen, und die Adresszeile «Germany» darf nicht die erste oder letzte Zeile im Adressblock sein.
Diese Wiederholung des Lookaround hat mich auf eine weitere Idee gebracht.
Gibt es einen Grep, mit dem ich in einem Textabschnitt alle Absätze finde, in denen ein Wort nicht vorkommt? Und umgekehrt: Wie finde ich alle Absätze, in denen ein bestimmtes Wort vorkommt?
Beginnen wir mit dem letzten Problem. Der Grep
^([^\r]*\bInDesign\b[^\r]*)+$\r?
findet alle Absätze, in denen das Wort «InDesign» (in genau dieser Schreibweise) vorkommt, und zwar auch dann, wenn es am Absatzbeginn, Absatzende, am Anfang oder am Schluss eines Textabschnitts steht. Auch eine Absatzmarke am Schluss eines Textabschnitts ist nicht notwendig, um den Absatz mit dem Wort zu markieren. (Die Wortgrenze \b in \bInDesign\b kann auch weggelassen werden, je nachdem, was man genau will.)
Etwas kniffliger ist die Lösung, wenn wir alle Absätze finden wollen, in denen das Wort «InDesign» nicht vorkommt. Hier brauchen wir einen negativen Lookbehind, der wiederholt wird. Der Grep
^((?<!InDesign)\X)+?(?<!InDesign)$\r?
findet also alle Absätze, in denen das Wort «InDesign» nicht vorkommt. Der zweite negative Lookbehind (?<!InDesign)$\r? dient übrigens nur dazu, das Suchresultat nicht zu verfälschen, falls «InDesign» direkt am Schluss eines Absatzes oder am Ende des ganzen Textabschnitts steht.
Wie Roland oben im Thread erklärt hat, steht \X für alle Zeichen inkl. Umbruchzeichen (deshalb +?, das Fragezeichen macht die Wiederholung nicht «greedy»).
Im Prinzip gehen wir also Zeichen für Zeichen durch den Absatz und schauen, dass nie vorher das Wort «Indesign» steht. Erst wenn dies für jedes Zeichen im Absatz zutrifft, wird die Fundstelle markiert.
Diese Notizen sind sicher eher etwas für «Grepologen», aber vielleicht gibt es auch die eine oder andere praktische Anwendung.
Danke für die Geduld und Gruss
Marco
als Antwort auf: [#497590]
(Dieser Beitrag wurde von Marco Morgenthaler am 5. Jul 2012, 12:54 geändert)