หากสายใดก็ตามที่ตามหลังการแข่งขันควรถูกลบออกไปsed
โปรแกรมของคุณจะต้องพิจารณาการแข่งขันที่ต่อเนื่องกัน กล่าวอีกนัยหนึ่งถ้าคุณลบบรรทัดหลังการแข่งขันซึ่งตรงกับแล้วคุณอาจจะลบบรรทัดตามนั้นเช่นกัน
มันมีการใช้งานที่เพียงพอ - แต่คุณต้องมองหลังนิดหน่อย
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
มันทำงานโดยการสลับการพักและช่องว่างรูปแบบสำหรับแต่ละบรรทัดที่อ่าน - ดังนั้นบรรทัดสุดท้ายสามารถเปรียบเทียบกับปัจจุบันในแต่ละครั้ง ดังนั้นเมื่อsed
อ่านบรรทัดมันจะแลกเปลี่ยนเนื้อหาของบัฟเฟอร์ - และบรรทัดก่อนหน้าคือเนื้อหาของบัฟเฟอร์การแก้ไขขณะที่บรรทัดปัจจุบันถูกวางไว้ในพื้นที่พัก
ดังนั้นsed
ตรวจสอบบรรทัดก่อนหน้าเพื่อหาคู่ที่ตรงกันmatch
และหาก!
ไม่พบนิพจน์ทั้งสองใน{
ฟังก์ชัน}
จะถูกเรียกใช้ sed
จะg
et พื้นที่ถือโดยการเขียนทับพื้นที่รูปแบบ - ซึ่งหมายความว่าบรรทัดปัจจุบันเป็นแล้วทั้งในการระงับและรูปแบบช่องว่าง - แล้วมันจะ//
ตรวจสอบสำหรับการแข่งขันที่จะแสดงออกปกติรวบรวมมากที่สุดเมื่อเร็ว ๆ นี้ - match
- และถ้ามันไม่ได้match
มัน ถูกp
rinted
ซึ่งหมายความว่าจะพิมพ์บรรทัดต่อเมื่อไม่มีและบรรทัดก่อนหน้านั้นทันทีจะไม่พิมพ์ นอกจากนี้ยังมองเห็นการแลกเปลี่ยนที่ไม่จำเป็นสำหรับลำดับของesmatch
match
match
หากคุณต้องการรุ่นที่สามารถปล่อยจำนวนบรรทัดที่เกิดขึ้นหลังจากmatch
นั้นจะต้องใช้งานเพิ่มอีกเล็กน้อย:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... แทนที่ 5 ด้วยจำนวนบรรทัด(รวมถึงบรรทัดที่ตรงกัน)ที่คุณต้องการลบ ...
1
2
3
4
12
13
14
21