Come dare un modello per la nuova linea in grep?

Come dare un modello per la nuova linea in grep? Nuova riga all’inizio, nuova riga alla fine. Non il modo di espressione regolare. Qualcosa come \ n.

grep modelli di grep sono abbinati alle singole linee quindi non c’è modo che un pattern corrisponda a una nuova riga trovata nell’input.

Tuttavia puoi trovare linee vuote come questa:

 grep '^$' file grep '^[[:space:]]*$' file # include white spaces 

prova pcregrep invece di grep regolare:

 pcregrep -M "pattern1.*\n.*pattern2" filename 

l’opzione -M consente di associare più righe, quindi puoi cercare le nuove righe come \n .

Puoi usare in questo modo …

 grep -P '^\s$' file 
  • -P viene utilizzato per le espressioni regolari Perl (un’estensione per POSIX grep ).
  • \s corrispondono ai caratteri dello spazio bianco; se seguito da * , corrisponde anche a una riga vuota.
  • ^ corrisponde all’inizio della linea. $ corrisponde alla fine della riga.

Per quanto riguarda la soluzione alternativa (senza utilizzare -P portatile), è ansible sostituire temporaneamente un carattere di nuova riga con quello diverso e modificarlo, ad esempio:

 grep -o "_foo_" <(paste -sd_ file) | tr -d '_' 

Fondamentalmente sta cercando la corrispondenza esatta _foo_ dove _ significa \n (quindi __ = \n\n ). Non è necessario tradurlo indietro con tr '_' '\n' , poiché ogni modello verrebbe comunque stampato nella nuova riga, quindi rimuovere _ è sufficiente.

Grazie a @jarno conosco l’opzione -z e ho scoperto che quando si usa GNU grep con l’opzione -P, la corrispondenza con \n è ansible . 🙂

Esempio:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

Stampa la bar