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.
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.
-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.
Terima kasih kepada @jarno, saya tahu tentang opsi -z dan saya menemukan bahwa saat menggunakan GNU grep dengan opsi -P, pencocokan terhadap \ndimungkinkan . :)
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 )?
new line at the beginning
adalah baris kosong dannew line at end
berlaku untuk setiap baris dalam file. Bisakah Anda memposting contoh?$
. Ini agak terbatas, tetapi dapat digunakan dalam kasus sederhana.Jawaban:
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
sumber
coba
pcregrep
daripada biasagrep
:pcregrep -M "pattern1.*\n.*pattern2" filename
yang
-M
pilihan memungkinkan untuk mencocokkan di beberapa baris, sehingga Anda dapat mencari baris baru sebagai\n
.sumber
Anda dapat menggunakan cara ini ...
grep -P '^\s$' file
-P
digunakan untuk ekspresi reguler Perl (perpanjangan dari POSIXgrep
).\s
cocokkan karakter spasi; jika diikuti oleh*
, itu juga cocok dengan baris kosong.^
cocok dengan awal baris.$
cocok dengan akhir baris.sumber
-P
adalah ekstensi GNU. Saya baik-baik saja untuk menggunakannya ketika situasi membutuhkannya (biasanya lookahead / lookbehind), tetapi POSIX grep dapat melakukan ini hanya dengan file[[:space:]]
.-P
. GNU juga cukup standar. :)brew install grep
mendapatkan GNU grep, yang lebih unggul dalam beberapa hal. apple.stackexchange.com/questions/193288/...Terima kasih kepada @jarno, saya tahu tentang opsi -z dan saya menemukan bahwa saat menggunakan GNU grep dengan opsi -P, pencocokan terhadap
\n
dimungkinkan . :)Contoh:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Cetakan
bar
sumber
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 kembalitr '_' '\n'
, karena setiap pola akan dicetak di baris baru, jadi menghapus_
sudah cukup.sumber
<(p paste -sd_ file )
?baru saja ditemukan
grep $'\r'
Ini digunakan
$'\r'
untuk pelarian gaya-c di Bash.di artikel ini
sumber