ตัวแก้ไขสตรีม - บัฟเฟอร์รูปแบบ

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

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

[jerry]$ vi 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

ตอนนี้ให้เราพิมพ์เนื้อหาไฟล์

[jerry]$ sed 'p' books.txt

เมื่อโค้ดด้านบนถูกเรียกใช้งานจะให้ผลลัพธ์ดังต่อไปนี้

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

คุณอาจสงสัยว่าทำไมแต่ละบรรทัดจึงแสดงสองครั้ง ให้เราค้นหา

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

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

ยินดีด้วย! เราได้ผลลัพธ์ที่คาดหวัง โดยค่าเริ่มต้น SED จะทำงานในทุกบรรทัด แต่เราสามารถบังคับให้ SED ทำงานในบางบรรทัดเท่านั้น ตัวอย่างเช่นในตัวอย่างด้านล่าง SED ทำงานในบรรทัดที่ 3 เท่านั้น ในตัวอย่างนี้เราได้ระบุช่วงที่อยู่ก่อนคำสั่ง SED

[jerry]$ sed -n '3p' books.txt

เมื่อโค้ดด้านบนถูกเรียกใช้งานจะให้ผลลัพธ์ดังต่อไปนี้

3) The Alchemist, Paulo Coelho, 197

นอกจากนี้เรายังสามารถสั่งให้ SED พิมพ์เฉพาะบางบรรทัด ตัวอย่างเช่นรหัสต่อไปนี้จะพิมพ์บรรทัดทั้งหมดตั้งแต่ 2 ถึง 5 ที่นี่เราได้ใช้ตัวดำเนินการลูกน้ำ (,) เพื่อระบุช่วงที่อยู่

[jerry]$ sed -n '2,5 p' books.txt

เมื่อโค้ดด้านบนถูกเรียกใช้งานจะให้ผลลัพธ์ดังต่อไปนี้

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

นอกจากนี้ยังมีอักขระพิเศษ Dollar ($) ซึ่งแสดงถึงบรรทัดสุดท้ายของไฟล์ ให้เราพิมพ์บรรทัดสุดท้ายของไฟล์

[jerry]$ sed -n '$ p' books.txt

เมื่อโค้ดด้านบนถูกเรียกใช้งานจะให้ผลลัพธ์ดังต่อไปนี้

6) A Game of Thrones, George R. R. Martin, 864

อย่างไรก็ตามเรายังสามารถใช้อักขระ Dollar ($) เพื่อระบุช่วงที่อยู่ได้ ตัวอย่างด้านล่างพิมพ์ผ่านบรรทัดที่ 3 ถึงบรรทัดสุดท้าย

[jerry]$ sed -n '3,$ p' books.txt

เมื่อโค้ดด้านบนถูกเรียกใช้งานจะให้ผลลัพธ์ดังต่อไปนี้

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

เราได้เรียนรู้วิธีระบุช่วงที่อยู่โดยใช้ตัวดำเนินการลูกน้ำ (,) SED รองรับตัวดำเนินการอีกสองตัวที่สามารถใช้เพื่อระบุช่วงที่อยู่ อันดับแรกคือตัวดำเนินการบวก (+) และสามารถใช้ได้กับตัวดำเนินการลูกน้ำ (,) ตัวอย่างเช่นM, +n จะพิมพ์ต่อไป n บรรทัดเริ่มต้นจากหมายเลขบรรทัด M. ฟังดูสับสน? ให้เราตรวจสอบด้วยตัวอย่างง่ายๆ ตัวอย่างต่อไปนี้จะพิมพ์ 4 บรรทัดถัดไปโดยเริ่มจากบรรทัดที่ 2

[jerry]$ sed -n '2,+4 p' books.txt

เมื่อโค้ดด้านบนถูกเรียกใช้งานจะให้ผลลัพธ์ดังต่อไปนี้

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

นอกจากนี้เรายังสามารถระบุช่วงที่อยู่โดยใช้ตัวดำเนินการ tilde (~) มันใช้M~nแบบฟอร์ม. แสดงว่า SED ควรเริ่มต้นที่หมายเลขบรรทัด M และประมวลผลทุกบรรทัด n (th) ตัวอย่างเช่น50~5ตรงกับบรรทัดที่ 50, 55, 60, 65 และอื่น ๆ ให้เราพิมพ์เฉพาะบรรทัดแปลก ๆ จากไฟล์

[jerry]$ sed -n '1~2 p' books.txt

เมื่อโค้ดด้านบนถูกเรียกใช้งานจะให้ผลลัพธ์ดังต่อไปนี้

1) A Storm of Swords, George R. R. Martin, 1216 
3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288

รหัสต่อไปนี้จะพิมพ์เฉพาะบรรทัดจากไฟล์

[jerry]$ sed -n '2~2 p' books.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