GNU/Linux >> Linux Esercitazione >  >> Linux

Grep String Dove la riga successiva non contiene string?

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.


Linux
  1. Perché il file di traduzione Bash non contiene tutti i testi di errore?

  2. Trovare l'ultimo elemento di una riga usando Grep?

  3. vim:comando non trovato

  4. Aggiunta di una riga a un file solo se non esiste già

  5. \d non è supportato dalle espressioni di base di grep?

Come trovare una stringa in un file su Linux

Lsb_release – Impossibile convertire la stringa in float:"8.04 Lts"?

CentOS/RHEL:il comando di montaggio non riesce con "mount:non contiene etichette SELinux"

grep:comando non trovato

trova il testo corrispondente e sostituisci la riga successiva

Cosa fa 'bash -c'?