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?
risposta
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
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
@jarno Supporta \ n nei modelli con la bandiera -P – rubystallion
È possibile utilizzare in questo modo ...
grep -P '^\s$' file
-P
viene utilizzato per espressioni regolari Perl (un'estensione POSIXgrep
).\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.
'-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
FWIW, le pagine di grep di Solaris e BSD (non controllate gli altri) hanno entrambi un paragrafo per '-P'. GNU è abbastanza standard comunque. :) –
+1 per regex :) – mattexx
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
.
Esattamente stavo cercando, grazie! – yorch
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.
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
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? –
In realtà puoi usare '$'. È un po 'limitato, ma utilizzabile in casi semplici. –
https://www.gnu.org/software/grep/manual/grep.html#Usage vedere l'articolo 15. – jarno