GNU/Linux >> Znalost Linux >  >> Linux

Grep String Kde další řádek neobsahuje řetězec?

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.


Linux
  1. Jak Grep linky, které nezačínají "#" nebo ";"?

  2. Jak najít všechny soubory, které neobsahují textový řetězec?

  3. Hledání poslední položky v řadě pomocí Grepu?

  1. Proč „ukončit &“ nefunguje?

  2. Lsb_release – Nelze převést řetězec na plovoucí:‚8,04 Lts‘?

  3. vim:příkaz nenalezen

  1. Co dělá 'bash -c'?

  2. wc -l NEpočítá poslední soubor, pokud nemá znak konce řádku

  3. grep najít soubory, které obsahují řetězec delší než x znaků?