Bagaimana cara memberi pola untuk baris baru di grep?


95

Bagaimana cara memberi pola untuk baris baru di grep? Baris baru di awal, baris baru di akhir. Bukan cara ekspresi reguler. Sesuatu seperti \ n.


6
Tidak jelas apa yang Anda inginkan. new line at the beginningadalah baris kosong dan new line at endberlaku untuk setiap baris dalam file. Bisakah Anda memposting contoh?
PP

2
Sebenarnya Anda bisa menggunakan $. Ini agak terbatas, tetapi dapat digunakan dalam kasus sederhana.
Krzysztof Jabłoński

Jawaban:


84

grep pola dicocokkan dengan baris individu sehingga tidak ada cara bagi pola untuk mencocokkan baris baru yang ditemukan di masukan.

Namun Anda dapat menemukan baris kosong seperti ini:

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

Setidaknya GNU grep memiliki opsi -z yang membuat grep memutuskan baris dengan karakter null. Namun, tampaknya tidak mendukung baris baru atau \ n berpola untuk mencocokkan baris baru, lihat laporan bug .
jarno

1
@jarno Mendukung \ n dalam pola dengan bendera -P
rubystallion

92

coba pcregrepdaripada biasa grep:

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

yang -Mpilihan memungkinkan untuk mencocokkan di beberapa baris, sehingga Anda dapat mencari baris baru sebagai \n.


22

Anda dapat menggunakan cara ini ...

grep -P '^\s$' file
  • -Pdigunakan untuk ekspresi reguler Perl (perpanjangan dari POSIX grep).
  • \scocokkan karakter spasi; jika diikuti oleh *, itu juga cocok dengan baris kosong.
  • ^cocok dengan awal baris. $cocok dengan akhir baris.

2
-Padalah ekstensi GNU. Saya baik-baik saja untuk menggunakannya ketika situasi membutuhkannya (biasanya lookahead / lookbehind), tetapi POSIX grep dapat melakukan ini hanya dengan file [[:space:]].
jordanm

1
FWIW, Solaris 'dan BSD's grep manpages (tidak mencentang yang lain) keduanya memiliki paragraf -P. GNU juga cukup standar. :)
K3 --- rnc

1
Dari halaman manual: [-P] Opsi ini tidak didukung di FreeBSD.
Marián Černý

Tidak ada [-P] untuk MacOsX: grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C [num]] [-e pattern] [-f file] [--binary-files = value] [--color [= when]] [--colour [= when]] [--context [= num]] [--label] [--line-buffered] [--null] [pattern] [file. ..]
Niccolò

@ Niccolò Anda pasti ingin brew install grepmendapatkan GNU grep, yang lebih unggul dalam beberapa hal. apple.stackexchange.com/questions/193288/...
herdrick

19

Terima kasih kepada @jarno, saya tahu tentang opsi -z dan saya menemukan bahwa saat menggunakan GNU grep dengan opsi -P, pencocokan terhadap \ndimungkinkan . :)

Contoh:

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

Cetakan bar


1
Bagus, perhatikan bahwa saya tidak mendapatkan notifikasi tentang "@jarno" di jawaban.
jarno

3
Ini bagus! Terima kasih banyak telah berbagi!
Alicia Tang

6

Adapun solusinya (tanpa menggunakan non-portabel -P), Anda dapat mengganti sementara karakter baris baru dengan yang berbeda dan mengubahnya kembali, misalnya:

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

Pada dasarnya ini mencari pencocokan tepat di _foo_mana _artinya \n(so __= \n\n). Anda tidak perlu menerjemahkannya kembali tr '_' '\n', karena setiap pola akan dicetak di baris baru, jadi menghapus _sudah cukup.


maafkan ketidaktahuan saya, tetapi apakah menggunakan substituion proses belum lagi kompatibel dengan NON posix, maka fitur non-portabel? di posix shell yang tidak bisa saya lakukan <(p paste -sd_ file )?
kemanusiaan dan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.