vim: Suche eine Zeile, die ein Muster enthält, das nicht in den benachbarten Zeilen vorkommt

vim: Suche eine Zeile, die ein Muster enthält, das nicht in den benachbarten Zeilen vorkommt

Ich möchte eine Möglichkeit finden, alle Zeilen anzuzeigen, die ein bestimmtes Muster enthalten, die benachbarten (vorherigen, nächsten) Zeilen jedoch nicht.

Beispiel: sagen wir, Muster ist das Wort „MUSTER“

1.#########################

2.#########MUSTER##########

3.##############################

dann ist die 2. Zeile gültig und wird angezeigt.

ABER

1.#########################

2.#########MUSTER##########

3.#########MUSTER##########

4.##############################

dann sind die 2. und 3. Zeile ungültig und werden daher nicht angezeigt

Antwort1

Sie möchten Regex-Erfassungsgruppen wie folgt verwenden:

/\v%(PATTERN.*\n.*)@<!(PATTERN)%(.*\n.*\1)@!

Beispiel

Das mag beängstigend aussehen, ist aber eigentlich ganz einfach:

  1. \vwird verwendet, um"sehr magisch"Regex (vermeidet die Verwendung von Backslashes für die meisten Sonderzeichen)
  2. PATTERN.*\n.*ist PATTERN, gefolgt von irgendetwas, einem Zeilenumbruch und wieder irgendetwas
  3. (...)@<!ist das Muster für negatives Look-Behind: Es bedeutet, dass wirwill nichtwas zwischen den Klammern steht, muss vorhanden sein. In unserem Fall sollte also der gesamte Schritt 2nicht vorhanden sein
  4. (PATTERN)Dies ist unser eigentliches Wort, das sollte existieren! Wir erfassen es mit Klammern für die zukünftige Verwendung
  5. .*\n.*\1ist irgendetwas, eine neue Zeile, wieder irgendetwas und unsere erfasste Gruppe (siehe Schritt 4)
  6. %(...)@!ist ein negativer Vorausblick, da wir wie zuvor nicht möchten, dass das, was zwischen den Klammern steht, existiert.

Im Grunde wollen wir also PATTERN, und zwar:

  • nicht von einer Zeile eingeleitet, die enthältPATTERN
  • nicht gefolgt von einer Zeile mitPATTERN

verwandte Informationen