จะลบหลายบรรทัดต่อการเกิดขึ้นในไฟล์ได้อย่างไร?


11

สมมติว่าฉันมีไฟล์บรรทัดนี้ 857835 มีเนื้อหาดังนี้:

a1
rubbish1
rubbish2
rubbish3
rubbish4
a1
rubbish5
rubbish6
rubbish7
rubbish8

และฉันต้องการที่จะลบสิ่งที่เกิดขึ้นทั้งหมดa1และบรรทัดถัดไป ( rubbish1และrubbish5ในตัวอย่างนี้) ฉันต้องทำอย่างไร?

ฉันพยายามที่grep 'a1' -v -A1จะไม่เกิดประโยชน์และความสามารถของฉันไม่ดีนัก:}

Google-fu ของฉันไม่สามารถช่วยฉันได้ในครั้งนี้มีคนช่วยด้วย!

คำตอบ:


16

ลอง:

sed -e '/^a1$/,+1d' "filename"

ซึ่งหมายความว่าจาก / ^ a1 $ / ถึงบรรทัดถัดไปให้ลบ

^ และ $ รับรองว่าคุณตรงกับทั้งบรรทัดดังนั้น a1 ที่ซ่อนจะไม่ถูกจับคู่


6
คุณอาจต้องการ^และ$ในการแข่งขันเพื่อบังคับให้การจับคู่ทั้งบรรทัด
Jander

@ Jander: ถูกต้องแก้ไข
asoundmove

12

ต่อไปนี้จะทำงานกับที่ไม่ใช่ GNU sed( ,+1ไวยากรณ์ที่อยู่เป็นส่วนขยายของ GNU):

sed -e '/^a1$/,/^/d' my_file >my_filtered_file

"การเริ่มต้นที่บรรทัดที่อ่านว่า 'a1' ทั้งหมดและสิ้นสุดที่บรรทัดถัดไปที่มีจุดเริ่มต้นของบรรทัดอยู่ (เช่นบรรทัดถัดไป) ลบ"

มันขยายได้น้อยกว่าคำตอบของ @ asoundmove แต่เนื่องจากการลบจำนวนบรรทัดที่แตกต่างกันจะใช้สคริปต์ที่แตกต่างกันโดยสิ้นเชิง

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