เหล่านี้คือsed
คำสั่งที่เป็นความลับที่ยอมรับได้ โดยเฉพาะ (จากman sed
):
: label ป้าย
กำกับสำหรับคำสั่ง b และ t
t label
หากในฐานะ /// ได้ทำการทดแทนที่ประสบความสำเร็จตั้งแต่บรรทัดอินพุตสุดท้ายถูกอ่านและตั้งแต่คำสั่ง t หรือ T ครั้งสุดท้ายให้แตกสาขาเป็นเลเบล หากไม่ระบุเลเบลให้แยกสาขาจนสุดสคริปต์
n N อ่าน / ต่อท้ายบรรทัดอินพุตถัดไปในพื้นที่รูปแบบ
ดังนั้นสคริปต์ที่คุณโพสต์สามารถแบ่งออกเป็น (ช่องว่างที่เพิ่มเข้ามาสำหรับ readbility):
sed ':a; $!N; s/\n/string/; ta'
--- ---- ------------- --
| | | |--> go back (`t`) to `a`
| | |-------------> substitute newlines with `string`
| |----------------------> If this is not the last line (`$!`), append the
| next line to the pattern space.
|----------------------------> Create the label `a`.
โดยทั่วไปสิ่งที่ทำสิ่งนี้สามารถเขียนใน pseudocode เป็น
while (not end of line){
append current line to this one and replace \n with 'string'
}
คุณสามารถเข้าใจสิ่งนี้ได้ดีขึ้นเล็กน้อยด้วยตัวอย่างอินพุตที่ซับซ้อนมากขึ้น:
$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5
ฉันไม่แน่ใจจริงๆว่าทำไมถึง!$
ต้องการ เท่าที่ฉันสามารถบอกได้คุณสามารถเอาท์พุทเดียวกันกับ
printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'