Chci ve všech souborech v adresáři a jeho podadresářích hledat řádky obsahující určitý řetězec, ale chci vyloučit ty výsledky, které obsahují jiný určitý řetězec v řádku bezprostředně za ním.
Například toto:
foo1 searchString bar
foo1 excludeString bar
foo2 searchString bar
something else
foo3 searchString bar
foo3 excludeString bar
foo4 searchString bar
by měl vrátit toto:
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar
Vím, že -A
vytiskne více řádků, a to -v
vylučuje výsledky. Ale můj současný přístup grep -r -A 1 "searchString" | grep -v "excludeString"
evidentně nemůže fungovat.
Existuje způsob, jak říci druhému grepu, že by měl také odstranit předchozí řádek, pokud najde shodu? Nebo nějaký jiný způsob, jak toho mohu dosáhnout?
Výkon není můj primární zájem; Bylo by hezké, kdyby byl příkaz relativně snadno zapamatovatelný.
Přijatá odpověď:
Můžete použít p
erl c
kompatibilní r
např. e
xpressions grep
:
$ pcregrep -M '(searchString.*\n)(?!.*excludeString)' file
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar
Hledá searchString
následovaný libovolným znakem .
, opakování nula nebo vícekrát *
, následovaný novým řádkem \n
pouze pokud není (?!
) vzor .*excludeString
vedle toho. Možnost -M
je přítomen, aby odpovídal více řádkům.