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 )
$ grep -Pzo "begin(.|\n)*\nend" file
begin
Some text goes here.
end
Catatan: untuk perintah lain, ganti saja jangkar '^' & '$' dengan jangkar baris baru '\n'
______________________________
Dengan perintah grep:
grep -Pzo "^begin\$(.|\n)*^end$" file
Jika Anda mau, jangan sertakan pola "mulai" dan "akhiri" dalam hasilnya, gunakan grep dengan dukungan Lookbehind dan Lookahead.
grep -Pzo "(?<=^begin$\n)(.|\n)*(?=\n^end$)" file
Anda juga dapat menggunakan \K
notifikasi alih-alih pernyataan Lookbehind.
grep -Pzo "^begin$\n\K(.|\n)*(?=\n^end$)" file
\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:
grep -Pzo "(?s)^begin$.*?^end$" file
grep -Pzo "^begin\$[\s\S]*?^end$" file
(?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:
grep -Pzo "^begin$\n\K[\s\S]*?(?=\n^end$)" file # or grep -Pzo "(?<=^begin$\n)[\s\S]*?(?=\n^end$)"
grep -Pzo "(?s)(?<=^begin$\n).*?(?=\n^end$)" file
lihat tes lengkap dari semua perintah di sini ( dari tanggal sebagai perilaku grep dengan parameter -P berubah )
^
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.
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
-P, --perl-regexp
Interpret PATTERN as a Perl compatible regular expression (PCRE)
-z, --null-data
Treat the input as a set of lines, each terminated by a zero byte (the ASCII
NUL character) instead of a newline. Like the -Z or --null option, this option
can be used with commands like sort -z to process arbitrary file names.
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.