พิมพ์บรรทัดระหว่าง (และรวมถึง) สองรูปแบบ


16

ฉันต้องการเริ่ม grepping จากบรรทัดที่มีCKที่ส่วนท้ายของบรรทัดและหยุดการ grepping เมื่อบรรทัดมีDที่สิ้นสุด ฉันพยายามgrep "$CK" "$D" file..txtแต่มันใช้งานไม่ได้

การป้อนข้อมูล:

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

ผลลัพธ์ที่ต้องการ:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D

คำตอบ:


21

คุณดีกว่าการใช้หรือ

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

หรือ

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

หากคุณยืนยันในนี่คือวิธี grep GNU

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

ที่นี่

-P เปิดใช้งาน Perl-regexp

-zตั้งค่าตัวคั่นบรรทัดเป็น NUL สิ่งนี้บังคับให้ grep เห็นไฟล์ทั้งหมดเป็นหนึ่งบรรทัด

-o พิมพ์การจับคู่เท่านั้น

(?s)เปิดใช้งาน PCRE_DOTALL เพื่อ.ค้นหาอักขระหรือบรรทัดใหม่

\N จับคู่อะไรก็ได้ยกเว้นขึ้นบรรทัดใหม่

.*?พบว่า ในโหมด nongreedy

(?<=..) เป็นการยืนยันที่อยู่เบื้องหลัง

(?=..) เป็นการยืนยันล่วงหน้า


ทำไมไม่เพิ่มเครื่องหมายทับ? เช่นนี้awk '/\/CK/,/\/D/' input
Rahul Patil

@RahulPatil นั่นเป็นเพราะ OP ระบุไว้ 'เริ่ม grepping จากบรรทัดที่มี "CK" ที่ท้ายบรรทัดและหยุดการ grepping เมื่อบรรทัดมี "D"'
iruvar

ดูเหมือนว่าฉันคุณมีความเข้าใจอย่างดีเกี่ยวกับ regex .. ฉันไม่เข้าใจระดับนั้นดังนั้นคุณช่วยอธิบายได้ไหมว่า grep PCRE สุดท้าย
Rahul Patil

@RahulPatil เพิ่มคำอธิบายบางอย่าง :-)
iruvar

@RohitPatil ฉันต้องการลบรายการที่ตรงกันออกจากไฟล์ ฉันจะทำอย่างนั้นได้ไหม
Rana Khan

0

หากคุณกำลังใช้ BSD grep(ไม่รองรับ parl regex param -P) นี่คือวิธีแก้ไข:

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

สิ่งนี้ทำงานโดยเชื่อมต่อทุกบรรทัด (แทนที่บรรทัดใหม่ด้วย _อักขระ) ตรวจสอบรูปแบบหนึ่งบรรทัดและขยายบรรทัดกลับสู่สถานะดั้งเดิม

หากคุณกำลังใช้ GNU grepคุณสามารถบรรลุการแข่งขันหลายในgrepแต่คุณจำเป็นต้องใช้ Perl-regexp สำหรับgrep( -P) เช่นที่กล่าวถึงในอีกคำตอบ คุณยังสามารถติดตั้ง GNU grepบน macOS ผ่านbrew install grepและใช้ggrepแทนได้


หรือคุณสามารถใช้pcregrepซึ่งรองรับรูปแบบหลายบรรทัด ( -M)


คุณยังสามารถใช้exคำสั่งเช่น:

ex +"/aaa/;/cdn/p" -scq! file
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.