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.

tuxnani.dll
sumber
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 
arash kordi
sumber
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.

nullrevolution
sumber
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.
Manikandan Rajendran
sumber
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

rubystallion
sumber
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.

kenorb
sumber
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
2

baru saja ditemukan

grep $'\r'

Ini digunakan $'\r'untuk pelarian gaya-c di Bash.

di artikel ini

HHHartmann
sumber