ตัวแก้ไขสตรีม - ลูป

เช่นเดียวกับภาษาโปรแกรมอื่น ๆ SED ก็มีสิ่งอำนวยความสะดวกในการวนซ้ำและการแยกสาขาเพื่อควบคุมขั้นตอนการดำเนินการ ในบทนี้เราจะเรียนรู้เพิ่มเติมเกี่ยวกับวิธีใช้ลูปและกิ่งก้านใน SED

ลูปใน SED ทำงานคล้ายกับไฟล์ gotoคำให้การ. SED สามารถข้ามไปยังบรรทัดที่มีป้ายกำกับและดำเนินการคำสั่งที่เหลือต่อไป ใน SED เราสามารถกำหนดไฟล์label ดังต่อไปนี้:

:label 
:start 
:end 
:up

ในตัวอย่างข้างต้นชื่อหลังเครื่องหมายจุดคู่ (:) แสดงถึงชื่อป้ายกำกับ

หากต้องการข้ามไปยังป้ายกำกับเฉพาะเราสามารถใช้ไฟล์ bตามด้วยชื่อป้ายกำกับ หากไม่ระบุชื่อป้ายกำกับ SED จะข้ามไปที่จุดสิ้นสุดของไฟล์ SED

ให้เราเขียนสคริปต์ SED ง่ายๆเพื่อทำความเข้าใจลูปและกิ่งก้าน ในไฟล์ books.txt ของเรามีรายการหนังสือและผู้แต่งหลายรายการ ตัวอย่างต่อไปนี้รวมชื่อหนังสือและชื่อผู้แต่งไว้ในบรรทัดเดียวโดยคั่นด้วยเครื่องหมายจุลภาค จากนั้นจะค้นหารูปแบบ "Paulo" หากรูปแบบตรงกันระบบจะพิมพ์ยัติภังค์ (-) ไว้ด้านหน้าบรรทัดมิฉะนั้นจะข้ามไปที่Print ฉลากที่พิมพ์เส้น

[jerry]$ sed -n ' 
h;n;H;x 
s/\n/, / 
/Paulo/!b Print 
s/^/- / 
:Print 
p' books.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
- The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
- The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin

ในตอนแรกสคริปต์ข้างต้นอาจดูคลุมเครือ ให้เราเข้าใจสิ่งนี้

  • สองคำสั่งแรกอธิบายได้เอง h;n;H;x และ s/\n/, / รวมชื่อหนังสือและผู้แต่งคั่นด้วยลูกน้ำ (,)

  • คำสั่งที่สามข้ามไปที่เลเบล Print เฉพาะเมื่อรูปแบบไม่ตรงกันมิฉะนั้นการแทนที่จะดำเนินการโดยคำสั่งที่สี่

  • :Print เป็นเพียงชื่อป้ายกำกับและอย่างที่ทราบกันดีอยู่แล้ว p คือคำสั่งพิมพ์

เพื่อปรับปรุงความสามารถในการอ่านคำสั่ง SED แต่ละคำสั่งจะอยู่ในบรรทัดแยกกัน อย่างไรก็ตามเราสามารถเลือกที่จะวางคำสั่งทั้งหมดในบรรทัดเดียวได้ดังนี้:

[jerry]$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
- The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
- The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin