Voglio cercare in tutti i file all'interno di una directory e nelle sue sottodirectory righe contenenti una determinata stringa, ma voglio escludere quei risultati che contengono una determinata stringa diversa nella riga immediatamente successiva.
Ad esempio, questo:
foo1 searchString bar
foo1 excludeString bar
foo2 searchString bar
something else
foo3 searchString bar
foo3 excludeString bar
foo4 searchString bar
dovrebbe restituire questo:
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar
So che -A
stampa più righe e quel -v
esclude i risultati. Ma il mio attuale approccio a grep -r -A 1 "searchString" | grep -v "excludeString"
ovviamente non può funzionare.
C'è un modo per dire al secondo grep che dovrebbe rimuovere anche la riga precedente se trova una corrispondenza? O in qualche altro modo come potrei raggiungere questo obiettivo?
Le prestazioni non sono la mia preoccupazione principale; Sarebbe bello se il comando fosse relativamente facile da ricordare.
Risposta accettata:
Puoi usare p
erl c
compatibili r
egular e
xpressions grep
:
$ pcregrep -M '(searchString.*\n)(?!.*excludeString)' file
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar
Cerca searchString
seguito da qualsiasi carattere .
, ripetuto zero o più volte *
, seguito dalla nuova riga \n
solo se c'è non (?!
) modello .*excludeString
Vicino a esso. Opzione -M
è presente per abbinare più righe.