Stream Editor - คำสั่งพื้นฐาน

บทนี้อธิบายคำสั่ง SED ที่มีประโยชน์หลายประการ

ลบคำสั่ง

SED มีคำสั่งต่างๆเพื่อจัดการกับข้อความ ก่อนอื่นให้เราสำรวจเกี่ยวกับไฟล์deleteคำสั่ง นี่คือวิธีดำเนินการคำสั่งลบ:

[address1[,address2]]d

address1 และ address2คือที่อยู่เริ่มต้นและสิ้นสุดตามลำดับซึ่งอาจเป็นได้ทั้งหมายเลขบรรทัดหรือสตริงรูปแบบ ที่อยู่ทั้งสองนี้เป็นพารามิเตอร์ทางเลือก

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

[jerry]$ sed 'd' books.txt

แต่ผลผลิตอยู่ที่ไหน? หากไม่มีการระบุที่อยู่บรรทัด SED จะทำงานทุกบรรทัดตามค่าเริ่มต้น ดังนั้นมันจะลบบรรทัดทั้งหมดออกจากบัฟเฟอร์รูปแบบ นั่นคือเหตุผลที่คำสั่งไม่พิมพ์อะไรบนเอาต์พุตมาตรฐาน

ให้เราสั่งให้ SED ทำงานในบางบรรทัดเท่านั้น ตัวอย่างต่อไปนี้จะลบบรรทัดที่ 4 เท่านั้น

[jerry]$ sed '4d' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

นอกจากนี้ SED ยังยอมรับช่วงที่อยู่โดยใช้ลูกน้ำ (,) เราสามารถสั่งให้ SED ลบเส้น N1 ถึง N2 ได้ ตัวอย่างเช่นตัวอย่างต่อไปนี้จะลบบรรทัดทั้งหมดตั้งแต่ 2 ถึง 4

[jerry]$ sed '2, 4 d' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

ช่วงที่อยู่ของ SED ไม่ได้ จำกัด เฉพาะตัวเลขเท่านั้น เราสามารถระบุรูปแบบเป็นที่อยู่ได้ด้วย ตัวอย่างต่อไปนี้จะลบหนังสือทั้งหมดของผู้แต่ง Paulo Coelho

[jerry]$ sed '/Paulo Coelho/d' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864

เรายังสามารถระบุช่วงที่อยู่โดยใช้รูปแบบข้อความ ตัวอย่างต่อไปนี้ลบเส้นทั้งหมดระหว่างรูปแบบStorm และ Fellowship.

[jerry]$ sed '/Storm/,/Fellowship/d' books.txt  
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

นอกจากนี้เรายังสามารถใช้ตัวดำเนินการดอลลาร์ ($) บวก (+) และเครื่องหมายทิลเดอ (~) กับ SED ได้อีกด้วย

เขียนคำสั่ง

การดำเนินการที่สำคัญอย่างหนึ่งที่เราดำเนินการกับไฟล์ใด ๆ คือการสำรองข้อมูลกล่าวคือเราทำสำเนาไฟล์อื่น SED ให้ไฟล์writeคำสั่งเพื่อเก็บเนื้อหาของบัฟเฟอร์รูปแบบในไฟล์ ด้านล่างนี้เป็นไวยากรณ์ของไฟล์write คำสั่งที่คล้ายกับ delete คำสั่ง

[address1[,address2]]w file

ที่นี่ address1 และ address2คือแอดเดรสเริ่มต้นและสิ้นสุดตามลำดับซึ่งอาจเป็นได้ทั้งหมายเลขบรรทัดหรือสตริงรูปแบบ ที่อยู่ทั้งสองนี้เป็นพารามิเตอร์ทางเลือก

ในไวยากรณ์ข้างต้น w หมายถึงคำสั่งเขียนและ fileคือชื่อไฟล์ที่คุณจัดเก็บเนื้อหา ระวังด้วยfileพารามิเตอร์. เมื่อระบุชื่อไฟล์ SED จะสร้างไฟล์ได้ทันทีหากไม่มีอยู่และเขียนทับหากมีอยู่แล้ว

ให้เราทำสำเนาไฟล์โดยใช้ SED โปรดทราบว่าต้องมีช่องว่างระหว่างw และ file.

[jerry]$ sed -n 'w books.bak' books.txt

เราได้สร้างไฟล์อื่นชื่อ books.bak. ตอนนี้ตรวจสอบว่าทั้งสองไฟล์มีเนื้อหาเหมือนกัน

[jerry]$ diff books.txt books.bak  
[jerry]$ echo $?

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

0

คุณอาจสันนิษฐานได้ว่าไฟล์ cpคำสั่งทำสิ่งเดียวกันทุกประการ ใช่ cpคำสั่งทำสิ่งเดียวกัน แต่ SED เป็นยูทิลิตี้ที่ครบกำหนด อนุญาตให้สร้างไฟล์ที่มีเฉพาะบางบรรทัดจากไฟล์ต้นฉบับ ให้เราเก็บเฉพาะบรรทัดไปยังไฟล์อื่น

[jerry]$ sed -n '2~2 w junk.txt' books.txt  
[jerry]$ cat junk.txt

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

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864

คุณยังสามารถใช้ตัวดำเนินการลูกน้ำ (,), ดอลลาร์ ($) และบวก (+) ได้ด้วยคำสั่ง write

นอกเหนือจากนี้ SED ยังรองรับการจับคู่รูปแบบกับคำสั่งเขียน สมมติว่าคุณต้องการจัดเก็บหนังสือทั้งหมดของผู้เขียนแต่ละคนไว้ในไฟล์แยกกัน วิธีหนึ่งที่น่าเบื่อและยาวคือทำด้วยตนเองและวิธีที่ชาญฉลาดกว่าคือการใช้ SED

[jerry]$ sed -n -e '/Martin/ w Martin.txt' -e '/Paulo/ w Paulo.txt' -e '/Tolkien/ w 
Tolkien.txt' books.txt

ในตัวอย่างข้างต้นเรากำลังจับคู่แต่ละบรรทัดกับรูปแบบและจัดเก็บบรรทัดที่ตรงกันในไฟล์เฉพาะ มันง่ายมาก ในการระบุหลายคำสั่งเราใช้-eสวิตช์ของคำสั่ง SED ตอนนี้ให้ใช้ดูว่าแต่ละไฟล์มีอะไรบ้าง:

[jerry]$ cat Martin.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
6) A Game of Thrones, George R. R. Martin, 864

ให้เราแสดงเนื้อหาของไฟล์

[jerry]$ cat Paulo.txt

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

3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288

ให้เราแสดงเนื้อหาของไฟล์

[jerry]$ cat Tolkien.txt

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

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432

ยอดเยี่ยม! เราได้ผลลัพธ์ที่คาดหวัง SED เป็นยูทิลิตี้ที่น่าทึ่งจริงๆ

ผนวกคำสั่ง

หนึ่งในการดำเนินการที่มีประโยชน์ที่สุดของโปรแกรมแก้ไขข้อความคือการเพิ่มฟังก์ชันการทำงาน SED สนับสนุนการดำเนินการนี้ผ่านคำสั่งต่อท้าย ด้านล่างเป็นไวยากรณ์ของการผนวก:

[address]a\ 
Append text

ให้เราต่อท้ายรายการหนังสือใหม่หลังบรรทัดหมายเลข 4 ตัวอย่างต่อไปนี้แสดงวิธีการทำ

[jerry]$ sed '4 a 7) Adultry, Paulo Coelho, 234' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
7) Adultry, Paulo Coelho, 234 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

ในส่วนคำสั่ง 4 หมายถึงหมายเลขบรรทัด a คือคำสั่งต่อท้ายและส่วนที่เหลือคือข้อความที่จะต่อท้าย

ให้เราแทรกบรรทัดข้อความที่ท้ายไฟล์ ในการดำเนินการนี้ให้ใช้$เป็นที่อยู่ ตัวอย่างต่อไปนี้แสดงให้เห็นสิ่งนี้:

[jerry]$ sed '$ a 7) Adultry, Paulo Coelho, 234' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864 
7) Adultry, Paulo Coelho, 234

นอกจากหมายเลขบรรทัดแล้วเรายังสามารถระบุที่อยู่โดยใช้รูปแบบข้อความได้อีกด้วย ตัวอย่างเช่นตัวอย่างต่อไปนี้ต่อท้ายข้อความหลังจากจับคู่สตริงThe Alchemist.

[jerry]$ sed '/The Alchemist/ a 7) Adultry, Paulo Coelho, 234' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 234 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

โปรดทราบว่าหากมีหลายรูปแบบที่ตรงกันข้อความจะถูกต่อท้ายหลังจากการแข่งขันแต่ละครั้ง ตัวอย่างต่อไปนี้แสดงสถานการณ์นี้

[jerry]$ sed '/The/ a 7) Adultry, Paulo Coelho, 234' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
7) Adultry, Paulo Coelho, 234 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 234 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
7) Adultry, Paulo Coelho, 234 
5) The Pilgrimage, Paulo Coelho, 288 
7) Adultry, Paulo Coelho, 234 
6) A Game of Thrones, George R. R. Martin, 864

เปลี่ยนคำสั่ง

SED จัดให้ change หรือ replaceคำสั่งซึ่งแสดงด้วย c. คำสั่งนี้ช่วยแทนที่บรรทัดที่มีอยู่ด้วยข้อความใหม่ เมื่อมีการระบุช่วงบรรทัดบรรทัดทั้งหมดจะถูกแทนที่เป็นกลุ่มด้วยบรรทัดข้อความเดียว ให้ด้านล่างเป็นไวยากรณ์ของคำสั่งเปลี่ยนแปลง:

[address1[,address2]]c\ 
Replace text

ให้เราแทนที่บรรทัดที่สามด้วยข้อความอื่น

[jerry]$ sed '3 c 3) Adultry, Paulo Coelho, 324' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

[jerry]$ sed '/The Alchemist/ c 3) Adultry, Paulo Coelho, 324' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

SED ยังช่วยให้สามารถเปลี่ยนหลายบรรทัดด้วยบรรทัดเดียว ตัวอย่างต่อไปนี้จะลบบรรทัดที่สี่ถึงหกและแทนที่ด้วยข้อความใหม่

[jerry]$ sed '4, 6 c 4) Adultry, Paulo Coelho, 324' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) Adultry, Paulo Coelho, 324

แทรกคำสั่ง

คำสั่งแทรกทำงานได้มากในลักษณะเดียวกับการผนวก ข้อแตกต่างเพียงอย่างเดียวคือการแทรกเส้นก่อนตำแหน่งเฉพาะ ให้ด้านล่างนี้เป็นไวยากรณ์ของคำสั่งแทรก:

[address]i\ 
Insert text

ให้เราเข้าใจคำสั่งแทรกพร้อมตัวอย่าง คำสั่งต่อไปนี้แทรกรายการใหม่ก่อนบรรทัดที่สี่

[jerry]$ sed '4 i 7) Adultry, Paulo Coelho, 324' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

ในตัวอย่างข้างต้น 4 คือหมายเลขสถานที่ i หมายถึงคำสั่งแทรกและส่วนที่เหลือคือข้อความที่จะแทรก

หากต้องการแทรกข้อความที่จุดเริ่มต้นของไฟล์ให้ระบุที่อยู่บรรทัดเป็น 1. คำสั่งต่อไปนี้แสดงสิ่งนี้:

[jerry]$ sed '1 i 7) Adultry, Paulo Coelho, 324' books.txt

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

7) Adultry, Paulo Coelho, 324
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

นอกจากนี้เราสามารถแทรกหลายบรรทัด คำสั่งต่อไปนี้แทรกสองบรรทัดก่อนบรรทัดสุดท้าย

[jerry]$ sed '$ i 7) Adultry, Paulo Coelho, 324

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

8) Eleven Minutes, Paulo Coelho, 304' books.txt 
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage,Paulo Coelho, 288 
7) Adultry, Paulo Coelho, 324 
8) Eleven Minutes, Paulo Coelho, 304 
6) A Game of Thrones, George R. R. Martin, 864

โปรดทราบว่ารายการที่จะแทรกจะถูกป้อนในบรรทัดแยกกันและคั่นด้วยอักขระแบ็กสแลช (\)

แปลคำสั่ง

SED มีคำสั่งในการแปลอักขระและแสดงเป็นไฟล์ y. มันแปลงอักขระตามตำแหน่ง ด้านล่างนี้เป็นไวยากรณ์ของคำสั่งแปล:

[address1[,address2]]y/list-1/list-2/

โปรดทราบว่าการแปลขึ้นอยู่กับตำแหน่งของอักขระจาก list 1 ไปยังอักขระในตำแหน่งเดียวกันใน list 2และทั้งสองรายการต้องเป็นรายการอักขระที่ชัดเจน ไม่รองรับนิพจน์ทั่วไปและคลาสอักขระ นอกจากนี้ขนาดของlist 1 และ list 2 ต้องเหมือนกัน

ตัวอย่างต่อไปนี้แปลงตัวเลขอารบิกเป็นตัวเลขโรมัน

[jerry]$ echo "1 5 15 20" | sed 'y/151520/IVXVXX/'

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

I V IV XX

l คำสั่ง

คุณสามารถแยกความแตกต่างระหว่างคำที่คั่นด้วยช่องว่างและคำที่คั่นด้วยอักขระแท็บโดยดูจากคำเหล่านั้นได้หรือไม่? ไม่แน่นอน แต่ SED สามารถทำเพื่อคุณได้ SED ใช้ไฟล์lคำสั่งเพื่อแสดงอักขระที่ซ่อนอยู่ในข้อความ ตัวอย่างเช่นอักขระแท็บที่มี\t และ End-Of-Line ด้วย $ตัวละคร. ด้านล่างนี้เป็นไวยากรณ์ของไฟล์l คำสั่ง

[address1[,address2]]l 
[address1[,address2]]l [len]

ให้เราสร้างไฟล์ที่มีอักขระแท็บสำหรับการสาธิต เพื่อความง่ายเราจะใช้ไฟล์เดียวกันเพียงแค่แทนที่ช่องว่างด้วยแท็บ รอ! แต่จะทำอย่างไร - โดยการเปิดไฟล์ในโปรแกรมแก้ไขข้อความและแทนที่แต่ละช่องว่างด้วยแท็บ? ไม่แน่นอน! เราสามารถใช้คำสั่ง SED สำหรับสิ่งนั้นได้

[jerry]$ sed 's/ /\t/g' books.txt > junk.txt

ตอนนี้ให้เราแสดงอักขระที่ซ่อนอยู่โดยใช้ไฟล์ l คำสั่ง:

[jerry]$ sed -n 'l' junk.txt

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

1)\tA\tStorm\tof\tSwords,George\tR.\tR.\tMartin,1216$ 
2)\tThe\tTwo\tTowers,J.\tR.\tR.\tTolkien,352$ 
3)\tThe\tAlchemist,Paulo\tCoelho,197$ 
4)\tThe\tFellowship\tof\tthe\tRing,J.\tR.\tR.\tTolkien,432$ 
5)\tThe\tPilgrimage,Paulo\tCoelho,288$ 
6)\tA\tGame\tof\tThrones,George\tR.\tR.\tMartin\t,864$

เช่นเดียวกับคำสั่ง SED อื่น ๆ มันยังยอมรับหมายเลขบรรทัดและรูปแบบเป็นที่อยู่ คุณสามารถลองด้วยตัวเอง

เรามาดูคุณสมบัติที่น่าสนใจอีกอย่างของ SED กัน เราสามารถสั่งให้ SED ทำการตัดบรรทัดหลังอักขระจำนวนหนึ่งได้ ตัวอย่างต่อไปนี้ตัดบรรทัดหลัง 25 อักขระ

[jerry]$ sed -n 'l 25' books.txt

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

1) A Storm of Swords,Geo\ 
rge R. R. Martin,1216$ 
2) The Two Towers,J. R. \ 
R. Tolkien,352$ 
3) The Alchemist,Paulo C\ 
oelho,197$ 
4) The Fellowship of the\ 
 Ring,J. R. R. Tolkien,4\ 
32$ 
5) The Pilgrimage,Paulo \ 
Coelho,288$ 
6) A Game of Thrones,Geo\ 
rge R. R. Martin ,864$

โปรดทราบว่าในตัวอย่างด้านบนขีด จำกัด การตัดถูกจัดเตรียมไว้หลังคำสั่ง l ในกรณีนี้คือ 25 อักขระ ตัวเลือกนี้เป็นตัวเลือกเฉพาะของ GNU และอาจใช้ไม่ได้กับ SED รุ่นอื่น ๆ

ขีด จำกัด การตัดเป็น 0 หมายถึงห้ามล้ำเส้นเว้นแต่จะมีอักขระขึ้นบรรทัดใหม่ คำสั่งง่ายๆต่อไปนี้แสดงให้เห็นถึงสิ่งนี้

[jerry]$ sed -n 'l 0' books.txt

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

1) A Storm of Swords,George R. R. Martin,1216$ 
2) The Two Towers,J. R. R. Tolkien,352$ 
3) The Alchemist,Paulo Coelho,197$ 
4) The Fellowship of the Ring,J. R. R. Tolkien,432$ 
5) The Pilgrimage,Paulo Coelho,288$ 
6) A Game of Thrones,George R. R. Martin,864$

ออกจากคำสั่ง

คำสั่ง Quit สั่งให้ SED ออกจากขั้นตอนการดำเนินการปัจจุบัน มันแสดงโดยqคำสั่ง ด้านล่างคือไวยากรณ์ของคำสั่งเลิก:

[address]q 
[address]q [value]

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

ให้เราพิมพ์ 3 บรรทัดแรกจากไฟล์

[jerry]$ sed '3 q' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

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

[jerry]$ sed '/The Alchemist/ q' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

นอกจากนี้ SED ยังสามารถยอมรับไฟล์ valueซึ่งสามารถใช้เป็นสถานะการออก คำสั่งต่อไปนี้แสดงสถานะการออกเป็น 100

[jerry]$ sed '/The Alchemist/ q 100' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

ตอนนี้ให้เราตรวจสอบสถานะการออก

[jerry]$ echo $?

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

100

อ่านคำสั่ง

เราสามารถสั่งให้ SED อ่านเนื้อหาของไฟล์และแสดงเมื่อเงื่อนไขที่ระบุตรงกัน คำสั่งแสดงด้วยตัวอักษรr. ด้านล่างนี้เป็นไวยากรณ์ของคำสั่ง read

[address]r file

โปรดทราบว่าต้องมีช่องว่างระหว่างไฟล์ r คำสั่งและชื่อไฟล์

ให้เราเข้าใจด้วยตัวอย่างง่ายๆ สร้างไฟล์ตัวอย่างชื่อjunk.txt.

[jerry]$ echo "This is junk text." > junk.txt

คำสั่งต่อไปนี้สั่งให้ SED อ่านเนื้อหาของ junk.txt และใส่ไว้หลังบรรทัดที่สาม

[jerry]$ sed '3 r junk.txt' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

ในตัวอย่างข้างต้น 3 หมายถึงที่อยู่บรรทัด r คือชื่อคำสั่งและ junk.txtคือชื่อไฟล์ที่จะแสดงเนื้อหา นอกจากนี้ GNU SED ยังยอมรับช่วงของที่อยู่ ตัวอย่างเช่นคำสั่งต่อไปนี้แทรกเนื้อหาของjunk.txt หลังจากบรรทัดที่สามสี่และห้า

[jerry]$ sed '3, 5 r junk.txt' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
This is junk text. 
5) The Pilgrimage, Paulo Coelho, 288 
This is junk text. 
6) A Game of Thrones, George R. R. Martin, 864

เช่นเดียวกับคำสั่ง SED อื่น ๆ คำสั่ง read ยังยอมรับรูปแบบเป็นที่อยู่ ตัวอย่างเช่นคำสั่งต่อไปนี้แทรกเนื้อหาของjunk.txt เมื่อการจับคู่รูปแบบสำเร็จ

[jerry]$ sed '/Paulo/ r junk.txt' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
This is junk text. 
6) A Game of Thrones, George R. R. Martin, 864

ดำเนินการคำสั่ง

เราสามารถรันคำสั่งภายนอกจาก SED โดยใช้ไฟล์ executeคำสั่ง มันแสดงโดยe. ให้ด้านล่างนี้คือไวยากรณ์ของคำสั่ง execute

[address1[,address2]]e [command]

ให้เราแสดงคำสั่ง execute ด้วยตัวอย่างง่ายๆ คำสั่ง SED ต่อไปนี้เรียกใช้ UNIXdate คำสั่งก่อนบรรทัดที่สาม

[jerry]$ sed '3 e date' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
Sun Sep  7 18:04:49 IST 2014 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

เช่นเดียวกับคำสั่งอื่น ๆ มันยังยอมรับรูปแบบเป็นที่อยู่ ตัวอย่างเช่นตัวอย่างต่อไปนี้ดำเนินการdateคำสั่งเมื่อการจับคู่รูปแบบสำเร็จ โปรดสังเกตว่าหลังจากการจับคู่รูปแบบแต่ละครั้งคำสั่งจะถูกเรียกใช้ก่อนจากนั้นเนื้อหาของบัฟเฟอร์รูปแบบจะปรากฏขึ้น

[jerry]$ sed '/Paulo/ e date' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
Sun Sep  7 18:06:04 IST 2014 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
Sun Sep  7 18:06:04 IST 2014 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

หากคุณสังเกตไวยากรณ์ของ e สั่งอย่างระมัดระวังคุณจะสังเกตเห็นว่า commandเป็นทางเลือก เมื่อไม่มีคำสั่งหลังe,มันถือว่าเนื้อหาของบัฟเฟอร์รูปแบบเป็นคำสั่งภายนอก เพื่อแสดงให้เห็นสิ่งนี้ให้เราสร้างไฟล์ commands.txt ด้วยคำสั่งง่ายๆ

[jerry]$ echo -e "date\ncal\nuname" > commands.txt 
[jerry]$ cat commands.txt

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

date 
cal 
uname

คำสั่งจากไฟล์สามารถอธิบายได้ด้วยตนเอง ในกรณีที่ไม่มีcommand หลังจาก e,SED เรียกใช้คำสั่งเหล่านี้ทั้งหมดทีละคำสั่ง ตัวอย่างง่ายๆต่อไปนี้แสดงให้เห็นถึงสิ่งนี้

[jerry]$ sed 'e' commands.txt

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

Sun Sep  7 18:14:20 IST 2014 
   September 2014      
Su Mo Tu We Th Fr Sa   
    1  2  3  4  5  6   
 7  8  9 10 11 12 13   
14 15 16 17 18 19 20   
21 22 23 24 25 26 27   
28 29 30               
                       
Linux

เช่นเดียวกับคำสั่ง SED อื่น ๆ คำสั่ง execute ยังยอมรับช่วงที่อยู่ที่ถูกต้องทั้งหมด

คำสั่งเบ็ดเตล็ด

โดยค่าเริ่มต้น SED จะทำงานบนบรรทัดเดียว แต่สามารถทำงานได้หลายสายเช่นกัน คำสั่งหลายบรรทัดแสดงด้วยอักษรตัวพิมพ์ใหญ่ ตัวอย่างเช่นไม่เหมือนกับไฟล์n คำสั่ง Nคำสั่งไม่ล้างและพิมพ์พื้นที่รูปแบบ แต่จะเพิ่มบรรทัดใหม่ (\ n) ที่ส่วนท้ายของพื้นที่รูปแบบปัจจุบันและต่อท้ายบรรทัดถัดไปจากอินพุตไฟล์ไปยังพื้นที่รูปแบบปัจจุบันและดำเนินการต่อด้วยโฟลว์มาตรฐานของ SED โดยดำเนินการคำสั่ง SED ที่เหลือ ด้านล่างนี้เป็นไวยากรณ์ของไฟล์N คำสั่ง

[address1[,address2]]N

ให้เราพิมพ์รายชื่อหนังสือที่คั่นด้วยจุลภาคและผู้แต่งตามลำดับ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงสิ่งนี้

[jerry]$ sed 'N; s/\n/, /g' 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

ให้เราเข้าใจว่าตัวอย่างข้างต้นทำงานอย่างไร Nคำสั่งอ่านบรรทัดแรกคือ A Storm of Swords ในบัฟเฟอร์รูปแบบและต่อท้าย \ n ตามด้วยบรรทัดถัดไป พื้นที่รูปแบบตอนนี้มีพายุดาบ\nจอร์จอาร์อาร์มาร์ติน ในขั้นตอนต่อไปเราจะแทนที่บรรทัดใหม่ด้วยลูกน้ำ

ชอบ p คำสั่งเรามี P คำสั่งเพื่อพิมพ์ส่วนแรก (ถึงบรรทัดใหม่ที่ฝังไว้) ของช่องว่างรูปแบบหลายบรรทัดที่สร้างโดย Nคำสั่ง ด้านล่างนี้เป็นไวยากรณ์ของไฟล์P คำสั่งที่คล้ายกับ p คำสั่ง

[address1[,address2]]P

ในตัวอย่างก่อนหน้านี้เราเห็นว่าไฟล์ Nคำสั่งสร้างรายการชื่อหนังสือและผู้แต่งที่คั่นด้วยขึ้นบรรทัดใหม่ ให้เราพิมพ์เฉพาะส่วนแรกของหนังสือนั่นคือเฉพาะชื่อหนังสือ คำสั่งต่อไปนี้แสดงสิ่งนี้

[jerry]$ sed -n 'N;P' books.txt

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

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

โปรดทราบว่าในกรณีที่ไม่มี Nมันจะทำงานเหมือนกับไฟล์ pคำสั่ง คำสั่งง่ายๆต่อไปนี้แสดงสถานการณ์นี้

[jerry]$ sed -n '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

นอกจากนี้ SED ยังมีไฟล์ vคำสั่งที่ตรวจสอบเวอร์ชัน หากเวอร์ชันที่ให้มามากกว่าเวอร์ชัน SED ที่ติดตั้งไว้การดำเนินการคำสั่งจะล้มเหลว โปรดทราบว่าตัวเลือกนี้เป็นตัวเลือกเฉพาะของ GNU และอาจใช้ไม่ได้กับ SED รุ่นอื่น ๆ ด้านล่างนี้เป็นไวยากรณ์ของไฟล์v คำสั่ง

[address1[,address2]]v [version]

ขั้นแรกค้นหาเวอร์ชันปัจจุบันของ SED

[jerry]$ sed --version

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

sed (GNU sed) 4.2.2

ในตัวอย่างต่อไปนี้เวอร์ชัน SED มากกว่าเวอร์ชัน 4.2.2 ดังนั้นคำสั่ง SED จึงยกเลิกการดำเนินการ

[jerry]$ sed 'v 4.2.3' books.txt

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

sed: -e expression #1, char 7: expected newer version of sed

แต่ถ้าเวอร์ชันที่ให้มาน้อยกว่าหรือเท่ากับเวอร์ชัน 4.2.2 คำสั่งจะทำงานตามที่คาดไว้

[jerry]$ sed 'v 4.2.2' 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