sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
แก้ไข 1:
ฉันควรจะอธิบายเรื่องนี้ดังนั้น ...
สิ่งนี้มีความซับซ้อนโดยไม่จำเป็น {}ผมไม่ทราบว่าช่วงที่อยู่ภายในได้รับอนุญาต ดังนั้นฉันจึงต้องแสดง "ลบบรรทัดว่าง" ต่างออกไป คำสั่งแกนtซึ่งเป็น sed if ... thenของวิธีการ Tจะง่ายกว่านี้ แต่ใช้ได้สำหรับ GNU เท่านั้น ฉันอ้างถึงหน้าคน:
t label: หากในฐานะ /// ทำการทดแทนได้สำเร็จตั้งแต่อ่านบรรทัดสุดท้ายแล้วและตั้งแต่คำสั่ง t หรือ T ครั้งสุดท้ายให้แตกสาขาเป็นเลเบล หากไม่ระบุเลเบลให้แยกสาขาจนสุดสคริปต์
ฉันละเมิดsคำสั่งที่มีชื่อเสียง มันจะไม่แทนที่สิ่งใด แต่ทดสอบว่าสายว่างหรือไม่ ดังนั้นจึงแทนที่บรรทัดว่างด้วยบรรทัดว่าง (สามารถใช้สิ่งใดก็ได้แทนเนื่องจากบรรทัดจะถูกลบต่อไป)
หากsทำ "การแทนที่" แสดงว่าบรรทัดนั้นว่างเปล่า ในกรณีนั้นคำสั่งdจะถูกดำเนินการ ไม่อย่างนั้นจะต้องทำอะไร เช่นเดียวกับที่tไม่กระโดดในกรณีของการsกระทำฉันต้องการคำสั่ง branch bเพื่อข้ามไปยังจุดสิ้นสุดของสคริปต์ : labelเป็นเป้าหมายสาขา เหมือนgotoย้อนกลับไปในยุคมืด (เมื่อถูกประดิษฐ์ ... te-hee)
อีกตัวเลือกหนึ่งคือให้s"แทนที่" บรรทัดที่ไม่ว่างทั้งหมดทำให้sซับซ้อนมากขึ้น แต่ส่วนที่เหลือของคำสั่งง่ายขึ้น:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$หมายถึง "บรรทัดที่ไม่ว่างเปล่า" และ\1หมายถึง "เนื้อหาของวงเล็บแรก"