2012-09-29 4 views
52

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

+6

non è chiaro ciò che si desidera. 'new line all'inizio 'è una riga vuota e' new line at end' si applica a ogni riga del file. Puoi pubblicare un esempio? –

+0

In realtà puoi usare '$'. È un po 'limitato, ma utilizzabile in casi semplici. –

+0

https://www.gnu.org/software/grep/manual/grep.html#Usage vedere l'articolo 15. – jarno

risposta

54

grep motivi sono abbinati alle singole righe, quindi non c'è modo per un modello di corrispondere a una nuova linea trovata nell'input.

Tuttavia è possibile trovare righe vuote come questo:

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

Almeno GNU grep ha l'opzione -z che rende le linee di interruzione di grep per carattere nullo. Tuttavia, non sembra supportare newline o \ n in pattern per farli corrispondere a newline, si veda [bug report] (https://bugs.launchpad.net/ubuntu/+source/grep/+bug/1641092). – jarno

+0

@jarno Supporta \ n nei modelli con la bandiera -P – rubystallion

10

È possibile utilizzare in questo modo ...

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

'-P' è un'estensione GNU.Sto bene per usarlo quando la situazione lo richiede (in genere lookahead/lookbehind), ma POSIX grep può farlo solo con '[[: space:]]'. – jordanm

+1

FWIW, le pagine di grep di Solaris e BSD (non controllate gli altri) hanno entrambi un paragrafo per '-P'. GNU è abbastanza standard comunque. :) –

+0

+1 per regex :) – mattexx

59

provare pcregrep invece di regolare grep:

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

l'opzione -M permette di abbinare su più righe, in modo da poter cercare nuove righe come \n.

+0

Esattamente stavo cercando, grazie! – yorch

3

Per quanto riguarda la soluzione (senza l'uso di non-portatile -P), si può temporaneamente sostituire nuova linea con il carattere diverso e cambiare di nuovo, ad esempio:

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

dove è alla ricerca di corrispondenza esatta _foo_ dove _ mezzi \n (quindi __ = \n\n). Non è necessario tradurlo entro tr '_' '\n', poiché ogni modello dovrebbe essere stampato nella nuova riga, quindi rimuovere _ è sufficiente.

0

Grazie a @jarno che so l'opzione -z e ho scoperto che quando si utilizza GNU grep con l'opzione -P, corrispondenza contro \n è possibile. :)

Esempio:

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

Stampe bar