Cetak garis antara (dan termasuk) dua pola

16

Saya ingin mulai mengambil dari garis yang ada CKdi ujung garis dan berhenti menangkap ketika garis ada Ddi akhir. Saya mencoba grep "$CK" "$D" file..txt, tetapi tidak berhasil.

Memasukkan:

kkkkkkkkkkk   
jjjjjjjjjjjjjjjjjj  
gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D  
GGGGGGGGGGGGGG  
GGGGGGGGGGGGGG

Output yang diinginkan:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D
Rana Khan
sumber

Jawaban:

21

Anda lebih baik menggunakan atau

awk '/CK$/,/D$/' file.txt

ATAU

sed -n '/CK$/,/D$/p' file.txt

Jika Anda bersikeras , inilah cara grep GNU

grep -oPz '(?s)(?<=\n)\N+CK\n.*?D(?=\n)' file.txt

Sini

-P mengaktifkan perl-regexp

-zset pemisah baris ke NUL. Ini memaksa grep untuk melihat seluruh file sebagai satu baris tunggal

-o hanya mencetak yang cocok

(?s)mengaktifkan PCRE_DOTALL, jadi .temukan setiap karakter atau baris baru

\N cocok dengan apa pun kecuali baris baru

.*?ditemukan. dalam mode nongreedy

(?<=..) adalah pernyataan pandangan ke belakang

(?=..) adalah pernyataan pandangan ke depan

iruvar
sumber
mengapa tidak menambahkan garis miring? seperti iniawk '/\/CK/,/\/D/' input
Rahul Patil
@RahulPatil, itu karena OP menyatakan 'mulailah menangkap dari garis yang memiliki "CK" di ujung garis dan berhenti menjilat ketika garis memiliki "D"'
iruvar
sepertinya saya, Anda memiliki pemahaman yang kuat tentang regex .. Saya tidak mengerti level itu, jadi bisakah Anda menjelaskan yang terakhir dari PCRE grep
Rahul Patil
@RahulPatil, menambahkan beberapa penjelasan :-)
iruvar
@RohitPatil, saya ingin menghapus pilihan yang cocok dari file. bisakah saya melakukan itu?
Rana Khan
0

Jika Anda menggunakan BSD grep(tidak mendukung perl regex param -P), berikut adalah solusinya:

grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'

Ini bekerja dengan menggabungkan semua garis (mengganti garis baru dengan _karakter), memeriksa pola satu garis dan memperluas garis kembali ke keadaan semula.

Jika Anda menggunakan GNU grep, Anda dapat mencapai pencocokan multiline grep, tetapi Anda harus menggunakan perl-regexp untuk grep( -P) seperti disebutkan dalam jawaban lain . Anda masih dapat menginstal GNU greppada macOS via brew install grepdan gunakan ggrepsebagai gantinya.


Atau Anda dapat menggunakan pcregrepyang mendukung pola multi-garis ( -M).


Anda juga dapat menggunakan experintah, misalnya:

ex +"/aaa/;/cdn/p" -scq! file
kenorb
sumber