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

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.