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.