Bagaimana cara memberi pola untuk baris baru di grep? Baris baru di awal, baris baru di akhir. Bukan cara ekspresi reguler. Sesuatu seperti \ n.
$
. Ini agak terbatas, tetapi dapat digunakan dalam kasus sederhana.
Bagaimana cara memberi pola untuk baris baru di grep? Baris baru di awal, baris baru di akhir. Bukan cara ekspresi reguler. Sesuatu seperti \ n.
$
. 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
coba pcregrep
daripada biasa grep
:
pcregrep -M "pattern1.*\n.*pattern2" filename
yang -M
pilihan memungkinkan untuk mencocokkan di beberapa baris, sehingga Anda dapat mencari baris baru sebagai \n
.
Anda dapat menggunakan cara ini ...
grep -P '^\s$' file
-P
digunakan untuk ekspresi reguler Perl (perpanjangan dari POSIX grep
).\s
cocokkan karakter spasi; jika diikuti oleh *
, itu juga cocok dengan baris kosong.^
cocok dengan awal baris. $
cocok dengan akhir baris. -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
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.
<(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?