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