GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Grep String Wo die nächste Zeile keinen String enthält?

Ich möchte alle Dateien in einem Verzeichnis und seinen Unterverzeichnissen nach Zeilen durchsuchen, die eine bestimmte Zeichenfolge enthalten, aber ich möchte diejenigen Ergebnisse ausschließen, die eine andere bestimmte Zeichenfolge in der Zeile unmittelbar danach enthalten.

Zum Beispiel dies:

foo1 searchString bar
foo1 excludeString bar

foo2 searchString bar
something else

foo3 searchString bar

foo3 excludeString bar

foo4 searchString bar

sollte Folgendes zurückgeben:

foo2 searchString bar
foo3 searchString bar
foo4 searchString bar

Ich kenne das -A druckt mehrere Zeilen, und das -v schließt Ergebnisse aus. Aber mein aktueller Ansatz von grep -r -A 1 "searchString" | grep -v "excludeString" kann offensichtlich nicht funktionieren.

Gibt es eine Möglichkeit, dem zweiten grep mitzuteilen, dass es auch die vorherige Zeile entfernen soll, wenn es eine Übereinstimmung findet? Oder auf andere Weise, wie ich das erreichen könnte?

Leistung ist nicht mein Hauptanliegen; Es wäre schön, wenn der Befehl relativ leicht zu merken wäre.

Akzeptierte Antwort:

Sie können p verwenden erl c kompatibel r zB e xpressions grep :

$ pcregrep -M '(searchString.*\n)(?!.*excludeString)' file
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar

Es sucht nach searchString gefolgt von einem beliebigen Zeichen . , null oder mehrmals wiederholt * , gefolgt von einer neuen Zeile \n nur wenn es nicht gibt (?! ) Muster .*excludeString Daneben. Option -M vorhanden ist, um mehrere Zeilen abzugleichen.


Linux
  1. Letztes Element in einer Zeile mit Grep finden?

  2. Lsb_release – String konnte nicht in Float konvertiert werden:„8.04 Lts“?

  3. vim:Befehl nicht gefunden

  4. Finden Sie passenden Text und ersetzen Sie die nächste Zeile

  5. Was macht 'bash -c'?

So finden Sie eine Zeichenfolge in einer Datei unter Linux

Eine Zeile nur an eine Datei anhängen, wenn sie noch nicht existiert

Wird \d von den grundlegenden Ausdrücken von grep nicht unterstützt?

wc -l zählt NICHT zuletzt in der Datei, wenn es kein Zeilenendezeichen hat

grep, um Dateien zu finden, die eine Zeichenfolge enthalten, die länger als x Zeichen ist?

Wie bekomme ich Zeilen, die eine Zeichenfolge in einer Datei enthalten?