ตัวแก้ไขสตรีม - ไวยากรณ์พื้นฐาน

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

sed [-n] [-e] 'command(s)' files 
sed [-n] -f scriptfile files

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

มาดูกันว่าเราจะระบุคำสั่ง SED หลายคำสั่งได้อย่างไร SED ให้ไฟล์deleteคำสั่งเพื่อลบบางบรรทัด ให้เราลบบรรทัดที่ 1, 2 และ 5 ในขณะนี้ให้ละเว้นรายละเอียดทั้งหมดของคำสั่งลบ เราจะพูดคุยเพิ่มเติมเกี่ยวกับคำสั่งลบในภายหลัง

ขั้นแรกแสดงเนื้อหาไฟล์โดยใช้ไฟล์ cat คำสั่ง

[jerry]$ cat 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 ลบเฉพาะบางบรรทัด ที่นี่ในการลบสามบรรทัดเราได้ระบุสามคำสั่งแยกกันด้วยตัวเลือก -e

[jerry]$ sed -e '1d' -e '2d' -e '5d' books.txt

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

3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864

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

ขั้นแรกสร้างไฟล์ข้อความที่มีคำสั่ง SED เพื่อให้เข้าใจง่ายให้เราใช้คำสั่ง SED เดียวกัน

[jerry]$ echo -e "1d\n2d\n5d" > commands.txt 
[jerry]$ cat commands.txt

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

1d 
2d 
5d

ตอนนี้สั่งให้ SED อ่านคำสั่งจากไฟล์ข้อความ ที่นี่เราได้ผลลัพธ์เช่นเดียวกับที่แสดงในตัวอย่างด้านบน

[jerry]$ sed -f commands.txt books.txt

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

3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones,George R. R. Martin, 864

ตัวเลือกมาตรฐาน

SED รองรับตัวเลือกมาตรฐานดังต่อไปนี้:

  • -n: การพิมพ์บัฟเฟอร์รูปแบบเริ่มต้น ตัวอย่างเช่นคำสั่ง SED ต่อไปนี้ไม่แสดงผลลัพธ์ใด ๆ :

  • [jerry]$ sed -n '' quote.txt
  • -e : อาร์กิวเมนต์ถัดไปคือคำสั่งแก้ไข ที่นี่วงเล็บเชิงมุมหมายถึงพารามิเตอร์บังคับ โดยใช้ตัวเลือกนี้เราสามารถระบุคำสั่งได้หลายคำสั่ง ให้เราพิมพ์แต่ละบรรทัดสองครั้ง:

  • [jerry]$ sed -e '' -e 'p' quote.txt

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

There is only one thing that makes a dream impossible to achieve: the fear of failure. 
There is only one thing that makes a dream impossible to achieve: the fear of failure. 
 - Paulo Coelho, The Alchemist 
 - Paulo Coelho, The Alchemist
  • -f : อาร์กิวเมนต์ถัดไปคือไฟล์ที่มีคำสั่งแก้ไข วงเล็บเชิงมุมหมายถึงพารามิเตอร์บังคับ ในตัวอย่างต่อไปนี้เราระบุคำสั่งพิมพ์ผ่านไฟล์:

[jerry]$ echo "p" > commands 
[jerry]$ sed -n -f commands quote.txt

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

There is only one thing that makes a dream impossible to achieve: the fear of failure. 
 - Paulo Coelho, The Alchemist

ตัวเลือกเฉพาะ GNU

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

  • -n, - เงียบ, - เงียบ: เหมือนกับตัวเลือกมาตรฐาน -n

  • -e script, --expression = script: เหมือนกับอ็อพชัน -e มาตรฐาน

  • -f script-file, --file = script-file: เหมือนกับอ็อพชัน -f มาตรฐาน

  • --follow-symlinks: หากมีให้ตัวเลือกนี้ SED จะติดตามลิงก์สัญลักษณ์ในขณะที่แก้ไขไฟล์

  • -i [SUFFIX] - ในตำแหน่ง [= SUFFIX]: ตัวเลือกนี้ใช้เพื่อแก้ไขไฟล์ในตำแหน่ง หากมีการระบุคำต่อท้ายระบบจะสำรองไฟล์ต้นฉบับมิฉะนั้นจะเขียนทับไฟล์ต้นฉบับ

  • -l N, --line-lenght = N: ตัวเลือกนี้กำหนดความยาวบรรทัดสำหรับคำสั่ง l เป็นอักขระ N

  • --posix: ตัวเลือกนี้ปิดใช้งานส่วนขยาย GNU ทั้งหมด

  • -r, --regexp-Extended: ตัวเลือกนี้อนุญาตให้ใช้นิพจน์ทั่วไปแบบขยายมากกว่านิพจน์ทั่วไปพื้นฐาน

  • -u, - ไม่บัฟเฟอร์: เมื่อมีตัวเลือกนี้ SED จะโหลดข้อมูลจำนวนน้อยที่สุดจากไฟล์อินพุตและล้างบัฟเฟอร์เอาต์พุตบ่อยขึ้น จะมีประโยชน์สำหรับการแก้ไขเอาต์พุตของ "tail -f" เมื่อคุณไม่ต้องการรอเอาต์พุต

  • -z, --null-data: โดยค่าเริ่มต้น SED จะแยกแต่ละบรรทัดด้วยอักขระขึ้นบรรทัดใหม่ หากมีตัวเลือก NULL-data จะแยกบรรทัดด้วยอักขระ NULL