Lebih tepatnya
Some text
begin
Some text goes here.
end
Some more text
dan saya ingin mengekstrak seluruh blok yang dimulai dari "mulai" hingga "akhir".
dengan awk yang bisa kita lakukan suka awk '/begin/,/end/' text
.
Bagaimana dengan grep?
Lebih tepatnya
Some text
begin
Some text goes here.
end
Some more text
dan saya ingin mengekstrak seluruh blok yang dimulai dari "mulai" hingga "akhir".
dengan awk yang bisa kita lakukan suka awk '/begin/,/end/' text
.
Bagaimana dengan grep?
Jawaban:
Diperbarui 18-Nov-2016 (karena perilaku grep berubah: grep dengan -P parameter sekarang tidak mendukung
^
dan$
berlabuh [di Ubuntu 16,04 dengan kernel v: 4.4.0-21-generic]) ( memperbaiki salah (non-) memperbaiki )Catatan: untuk perintah lain, ganti saja jangkar '^' & '$' dengan jangkar baris baru
'\n'
______________________________Dengan perintah grep:
Jika Anda mau, jangan sertakan pola "mulai" dan "akhiri" dalam hasilnya, gunakan grep dengan dukungan Lookbehind dan Lookahead.
Anda juga dapat menggunakan
\K
notifikasi alih-alih pernyataan Lookbehind.\K
opsi abaikan semuanya sebelum pencocokan pola dan abaikan pola itu sendiri.\n
digunakan untuk menghindari pencetakan baris kosong dari output.Atau seperti @AvinashRaj menyarankan ada grep mudah sederhana sebagai berikut:
(?s)
memberitahu grep untuk mengizinkan titik untuk mencocokkan karakter baris baru.[\s\S]
cocok dengan karakter apa pun yang berupa spasi putih atau non-spasi putih.Dan output mereka tanpa termasuk "mulai" dan "akhir" adalah sebagai berikut:
lihat tes lengkap dari semua perintah di sini ( dari tanggal sebagai perilaku grep dengan parameter -P berubah )
catatan:
^
arahkan awal suatu garis dan$
arahkan ujung suatu garis. ini ditambahkan ke sekitar "awal" dan "akhir" untuk mencocokkan mereka jika mereka sendirian dalam satu baris.Dalam dua perintah saya melarikan diri
$
karena ia juga menggunakan untuk "Pergantian Perintah" ($(command)
) yang memungkinkan output dari suatu perintah untuk mengganti nama perintah.Dari man grep:
sumber
grep -Pzo "(?<=begin\n)(.|\n)*(?=\nend)" file
agar tidak mencetak\n
karakter yang ada pada baris begin.grep -Pzo "(?s)begin.*?end" file
grep -Pzo "begin[\s\S]*?end" file
grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt
Terjemahan kesalahan adalah sesuatu seperti:grep: a not protected ^ or $ is not supported with -Pz
grep
nampaknya telah berubah.Jika Anda
grep
tidak mendukung sintaks perl (-P
), Anda dapat mencoba menggabungkan garis, mencocokkan pola, lalu memperluas garis lagi seperti di bawah ini:sumber