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.