นี่คืออีกsed
:
sed -e:n -e'/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D <in >out
นั่นเป็นอย่างที่คุณถาม มันใช้งานได้บนสแต็ก - สร้างเมื่อจำเป็นและนานเท่าที่จำเป็นระหว่างการเกิดบรรทัดที่คอมเม้นต์และการทิ้งบัฟเฟอร์เก่าเพื่อสนับสนุนบรรทัดคอมเม้นต์ใหม่เพิ่มเติมในอินพุตเมื่อพบสิ่งนั้น ภาพ...
ขอโทษด้วยฉันไม่รู้ว่าทำไมฉันถึงทำอย่างนั้น แต่มันก็อยู่ในใจ
อย่างไรก็ตามการsed
แพร่กระจายบัฟเฟอร์ระหว่างแต่ละบรรทัดที่ถูกคอมเม้นต์สุดท้ายในซีรีย์ใด ๆ ไม่เคยเก็บหนึ่งในบัฟเฟอร์ไว้มากกว่าที่จำเป็นในการติดตามเหตุการณ์ที่ถูกคอมเม้นต์ล่าสุดอย่างถูกต้องและหากใดก็ตามที่พบบรรทัดสุดท้ายในขณะที่พยายามทำg
คำสั่งการดำเนินการ lobal สุดท้ายและสาขาt
คือบัฟเฟอร์ทั้งหมดที่จะพิมพ์มิฉะนั้นมันจะลบP
บรรทัดเหล่านั้นทั้งหมดที่มันออกจากบัฟเฟอร์ทันทีที่ทำ
ฉันคิดว่านี่เป็นสิ่งที่นำไปสู่ความคิดที่สอดคล้องกัน ...
printf %s\\n \#alice \#bob charlie dotan eric \
\#alice \#bob charlie dotan eric \
\#alice \#bob charlie dotan eric |
sed -e:n -e'l;/\n#.*\ndotan/!{$!{N;/^#/bn' \
-eb -e\} -e'/^#/s/\(\n\)\(dotan.*\)*/\1#\2/g' \
-et -e\} -eP\;D
#alice
#alice\n#bob$
#alice\n#bob\ncharlie$
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob\ncharlie\ndotan\neric\n#alice$
#bob\ncharlie\ndotan\neric\n#alice\n#bob$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie$
#bob\ncharlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
#bob
charlie\ndotan\neric\n#alice\n#bob\ncharlie\ndotan$
charlie
dotan\neric\n#alice\n#bob\ncharlie\ndotan$
dotan
eric\n#alice\n#bob\ncharlie\ndotan$
eric
#alice\n#bob\ncharlie\ndotan$
#alice
#bob\ncharlie\ndotan$
#bob\ncharlie\ndotan\neric$
#bob
#charlie
#dotan
eric
มีความแตกต่างเพียงอย่างเดียวระหว่างคำสั่งนี้กับคำสั่งด้านบนและนั่นคือl
คำสั่ง ook ที่ด้านบน เมื่อเราเข้ามาl
ในsed
พื้นที่ของรูปแบบการทำงานเราจะได้รับความคิดที่ดีขึ้นของสิ่งที่เกิดขึ้นเบื้องหลังและความเข้าใจที่ดีขึ้นของวิธีการที่จะนำความพยายามของมัน
ในกรณีนี้เราสามารถดูsed
อินพุตสแต็กจนกระทั่งพบการเกิดขึ้นครั้งที่สองของ\n#.*\ndotan
อินพุทและเมื่อมันเริ่มพิมพ์บรรทัดก่อนหน้าออกทีละครั้ง มันเจ๋งนะ ฉันได้เรียนรู้มากมายเกี่ยวกับสิ่งนี้