วิธีใช้คำสั่ง sed บน Linux

อาจฟังดูบ้า แต่sedคำสั่งLinux เป็นโปรแกรมแก้ไขข้อความที่ไม่มีอินเทอร์เฟซ คุณสามารถใช้มันจากบรรทัดคำสั่งเพื่อจัดการข้อความในไฟล์และสตรีม เราจะแสดงวิธีควบคุมพลังของมัน

พลังแห่งความสงบ

sedคำสั่งเป็นบิตเช่นหมากรุก: มันจะใช้เวลาหนึ่งชั่วโมงในการเรียนรู้พื้นฐานและชีวิตที่จะ master พวกเขา (หรืออย่างน้อยเป็นจำนวนมากของการปฏิบัติ) เราจะแสดงตัวเลือกของกลเม็ดเปิดในแต่ละหมวดหมู่หลักของsedฟังก์ชันการทำงาน

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

ด้วยsedคุณสามารถทำสิ่งต่อไปนี้ทั้งหมด:

  • เลือกข้อความ
  • แทนที่ข้อความ
  • เพิ่มบรรทัดในข้อความ
  • ลบบรรทัดจากข้อความ
  • แก้ไข (หรือเก็บรักษา) ไฟล์ต้นฉบับ

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

ที่เกี่ยวข้อง: วิธีใช้นิพจน์ทั่วไป (regexes) บน Linux

ตัวอย่างง่ายๆ

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

echo howtogonk | sed 's / gonk / geek /'

echoคำสั่งส่ง“howtogonk” ลงsedและกฎเปลี่ยนตัวของเราง่าย (“S” ย่อมาทดแทน) ถูกนำไปใช้ sed ค้นหาข้อความที่ป้อนเพื่อหาการเกิดขึ้นของสตริงแรกและจะแทนที่รายการที่ตรงกันด้วยรายการที่สอง

สตริง "gonk" ถูกแทนที่ด้วย "geek" และสตริงใหม่จะถูกพิมพ์ในหน้าต่างเทอร์มินัล

การแทนที่น่าจะเป็นการใช้sed. ก่อนที่เราจะเจาะลึกลงไปในการแทนที่เราจำเป็นต้องรู้วิธีเลือกและจับคู่ข้อความ

การเลือกข้อความ

เราจะต้องมีไฟล์ข้อความสำหรับตัวอย่างของเรา เราจะใช้บทที่มีการคัดสรรจากบทกวีมหากาพย์ของ Samuel Taylor Coleridge“ The Rime of the Ancient Mariner”

เราพิมพ์สิ่งต่อไปนี้เพื่อดูด้วยless:

coleridge.txt น้อยลง

ในการเลือกบางบรรทัดจากไฟล์เราจะจัดเตรียมบรรทัดเริ่มต้นและจุดสิ้นสุดของช่วงที่เราต้องการเลือก หมายเลขเดียวจะเลือกหนึ่งบรรทัด

ในการแยกบรรทัดหนึ่งถึงสี่เราพิมพ์คำสั่งนี้:

sed -n '1,4p' coleridge.txt

หมายเหตุจุลภาคระหว่างและ1 หมายถึง“พิมพ์บรรทัดจับคู่.” โดยค่าเริ่มต้น   พิมพ์ทุกบรรทัด เราจะเห็นข้อความทั้งหมดในไฟล์พร้อมกับพิมพ์บรรทัดที่ตรงกันสองครั้ง เพื่อป้องกันปัญหานี้เราจะใช้ตัวเลือก (เงียบ) เพื่อระงับข้อความที่ไม่ตรงกัน4psed-n

เราเปลี่ยนหมายเลขบรรทัดเพื่อให้เราสามารถเลือกกลอนอื่นดังที่แสดงด้านล่าง:

sed -n '6,9p' coleridge.txt

เราสามารถใช้-eตัวเลือก (นิพจน์) เพื่อทำการเลือกหลายรายการ ด้วยสองสำนวนเราสามารถเลือกสองข้อดังนี้:

sed -n -e '1,4p' -e '31, 34p 'coleridge.txt

ถ้าเราลดจำนวนแรกในนิพจน์ที่สองเราสามารถแทรกช่องว่างระหว่างสองข้อ เราพิมพ์สิ่งต่อไปนี้:

sed -n -e '1,4p' -e '30, 34p 'coleridge.txt

นอกจากนี้เรายังสามารถเลือกบรรทัดเริ่มต้นและบอกsed ให้ก้าวผ่านไฟล์และพิมพ์บรรทัดอื่นทุกบรรทัดที่ห้าหรือข้ามบรรทัดจำนวนเท่าใดก็ได้ คำสั่งคล้ายกับที่เราใช้ข้างต้นเพื่อเลือกช่วง อย่างไรก็ตามในครั้งนี้เราจะใช้เครื่องหมายทิลเดอร์ ( ~) แทนเครื่องหมายจุลภาคเพื่อแยกตัวเลข

ตัวเลขแรกระบุเส้นเริ่มต้น ตัวเลขที่สองบอกว่าsedบรรทัดใดหลังจากเส้นเริ่มต้นที่เราต้องการดู หมายเลข 2 หมายถึงทุกบรรทัดที่สอง 3 หมายถึงทุกบรรทัดที่สามและอื่น ๆ

เราพิมพ์สิ่งต่อไปนี้:

sed -n '1 ~ 2p' coleridge.txt

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

เครื่องหมายคาเร็ต ( ^) แสดงถึงจุดเริ่มต้นของบรรทัด เราจะใส่คำค้นหาของเราด้วยเครื่องหมายทับ ( /) นอกจากนี้เรายังใส่ช่องว่างหลัง "และ" ด้วยดังนั้นคำเช่น "Android" จะไม่รวมอยู่ในผลลัพธ์

การอ่านsedสคริปต์อาจเป็นเรื่องยากในตอนแรก /p วิธีการ“พิมพ์” เช่นเดียวกับที่ทำในคำสั่งที่เราใช้ข้างต้น ในคำสั่งต่อไปนี้เครื่องหมายทับจะนำหน้า:

sed -n '/ ^ และ / p' coleridge.txt

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

ทำการเปลี่ยนตัว

ในตัวอย่างแรกของเราเราแสดงให้คุณเห็นรูปแบบพื้นฐานต่อไปนี้สำหรับการsedทดแทน:

echo howtogonk | sed 's / gonk / geek /'

sบอกsed นี้คือการทดแทน สตริงแรกคือรูปแบบการค้นหาและสตริงที่สองคือข้อความที่เราต้องการแทนที่ข้อความที่ตรงกัน แน่นอนเช่นเดียวกับ Linux ทุกอย่างปีศาจอยู่ในรายละเอียด

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

sed -n 's / วัน / สัปดาห์ / p' coleridge.txt

ในบรรทัดแรกจะมีการเปลี่ยนแปลงเฉพาะ“ วัน” ที่สองเท่านั้นที่เปลี่ยนแปลง นี่เป็นเพราะsedหยุดหลังจากการแข่งขันครั้งแรกต่อบรรทัด เราต้องเพิ่ม“ g” ที่ส่วนท้ายของนิพจน์ดังที่แสดงด้านล่างเพื่อทำการค้นหาทั่วโลกดังนั้นการจับคู่ทั้งหมดในแต่ละบรรทัดจึงถูกประมวลผล:

sed -n 's / วัน / สัปดาห์ / gp' coleridge.txt

สิ่งนี้ตรงกับสามในสี่ในบรรทัดแรก เนื่องจากคำแรกคือ "วัน" และsedคำนึงถึงตัวพิมพ์เล็กและใหญ่จึงไม่ถือว่าอินสแตนซ์นั้นเหมือนกับ "วัน"

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

sed -n 's / วัน / สัปดาห์ / gip' coleridge.txt

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

ตัวอย่างเช่นหากเราใส่อักขระในวงเล็บเหลี่ยม ( []) อักขระเหล่านี้จะถูกตีความว่าเป็น "อักขระใด ๆ จากรายการอักขระนี้"

เราพิมพ์ข้อความต่อไปนี้และรวม "D" และ "d" ไว้ในกลุ่มเพื่อให้แน่ใจว่าตรงกันทั้ง "วัน" และ "วัน":

sed -n 's / [Dd] ay / week / gp' coleridge.txt

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

sed -n '1,4p' coleridge.txt

เราจะค้นหาช่องว่างสองช่องและแทนที่ด้วยช่องว่าง เราจะทำสิ่งนี้ทั่วโลกเพื่อให้เกิดการกระทำซ้ำตลอดทั้งบรรทัด เพื่อให้ชัดเจนรูปแบบการค้นหาคือช่องว่างเครื่องหมายดอกจันช่องว่าง ( *) และสตริงการแทนที่คือช่องว่างเดียว 1,4จำกัด ทดแทนสี่บรรทัดแรกของไฟล์

เรารวมทุกอย่างเข้าด้วยกันในคำสั่งต่อไปนี้:

sed -n '1,4 วินาที / * / / gp' coleridge.txt

ใช้งานได้ดี! รูปแบบการค้นหาคือสิ่งที่สำคัญที่นี่ เครื่องหมายดอกจัน ( *) แสดงถึงศูนย์หรือมากกว่าของอักขระนำหน้าซึ่งเป็นช่องว่าง ดังนั้นรูปแบบการค้นหาจึงมองหาสตริงที่มีช่องว่างตั้งแต่หนึ่งช่องขึ้นไป

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

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

sed -n '1,4 วินาที / * / / gp' coleridge.txt

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

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

เราพิมพ์สิ่งต่อไปนี้โดยใช้-e(นิพจน์) ที่เราใช้ก่อนหน้านี้ซึ่งช่วยให้เราทำการแทนที่สองครั้งขึ้นไปพร้อมกัน:

sed -n -e 's / motion / flutter / gip' -e 's / ocean / gutter / gip' coleridge.txt

เราสามารถบรรลุผลลัพธ์เดียวกันได้ถ้าเราใช้อัฒภาค ( ;) เพื่อแยกสองนิพจน์ดังนี้:

sed -n 's / motion / flutter / gip; s / ocean / gutter / gip' coleridge.txt

เมื่อเราสลับ "วัน" สำหรับ "สัปดาห์" ในคำสั่งต่อไปนี้อินสแตนซ์ของ "วัน" ในนิพจน์ "well a-day" จะถูกสลับด้วยเช่นกัน:

sed -n 's / [Dd] ay / week / gp' coleridge.txt

เพื่อป้องกันปัญหานี้เราสามารถลองแทนที่เส้นที่ตรงกับรูปแบบอื่นเท่านั้น หากเราแก้ไขคำสั่งให้มีรูปแบบการค้นหาในตอนเริ่มต้นเราจะพิจารณาดำเนินการเฉพาะบรรทัดที่ตรงกับรูปแบบนั้นเท่านั้น

เราพิมพ์ข้อความต่อไปนี้เพื่อให้รูปแบบการจับคู่ของเราเป็นคำว่า“ หลัง”:

sed -n '/ after / s / [Dd] ay / week / gp' coleridge.txt

นั่นทำให้เราได้รับการตอบสนองที่เราต้องการ

การเปลี่ยนตัวที่ซับซ้อนมากขึ้น

ให้ Coleridge หยุดพักและใช้sedเพื่อแยกชื่อจากetc/passwdไฟล์

มีวิธีที่สั้นกว่าในการทำเช่นนี้ (เพิ่มเติมในภายหลัง) แต่เราจะใช้วิธีที่ยาวกว่านี้เพื่อแสดงแนวคิดอื่น แต่ละรายการที่ตรงกันในรูปแบบการค้นหา (เรียกว่านิพจน์ย่อย) สามารถกำหนดหมายเลขได้ (สูงสุดเก้ารายการ) จากนั้นคุณสามารถใช้ตัวเลขเหล่านี้ในsedคำสั่งของคุณ  เพื่ออ้างอิงนิพจน์ย่อยเฉพาะ

คุณต้องใส่นิพจน์ย่อยในวงเล็บ [ ()] เพื่อให้สามารถใช้งานได้ นอกจากนี้วงเล็บยังต้องนำหน้าด้วยเครื่องหมายทับ ( \) เพื่อป้องกันไม่ให้ถือว่าเป็นอักขระปกติ

ในการดำเนินการนี้คุณจะต้องพิมพ์สิ่งต่อไปนี้:

sed 's / \ ([^:] * \). * / \ 1 /' / etc / passwd

มาทำลายสิ่งนี้:

  • sed 's/:sedคำสั่งและจุดเริ่มต้นของการแสดงออกทดแทน
  • \(:วงเล็บเปิด [ (] ล้อมรอบนิพจน์ย่อยนำหน้าด้วยแบ็กสแลช ( \)
  • [^:]*:นิพจน์ย่อยแรกของข้อความค้นหาประกอบด้วยกลุ่มในวงเล็บเหลี่ยม คาเร็ต ( ^) หมายถึง“ ไม่” เมื่อใช้ในกลุ่ม กลุ่มหมายถึงอักขระใด ๆ ที่ไม่ใช่เครื่องหมายจุดคู่ ( :) จะได้รับการยอมรับให้ตรงกัน
  • \):วงเล็บปิด [ )] ที่มีเครื่องหมายแบ็กสแลช ( \) นำหน้า
  • .*:นิพจน์ย่อยการค้นหาที่สองนี้หมายถึง "อักขระใด ๆ และจำนวนเท่าใดก็ได้"
  • /\1:ส่วนการแทนที่ของนิพจน์มี1เครื่องหมายแบ็กสแลช ( \) นำหน้า สิ่งนี้แสดงถึงข้อความที่ตรงกับนิพจน์ย่อยแรก
  • /':การปิด forward-slash ( /) และ single quote ( ') สิ้นสุดsedคำสั่ง

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

แต่ละบรรทัดใน/etc/passwdไฟล์เริ่มต้นด้วยชื่อผู้ใช้ที่สิ้นสุดด้วยเครื่องหมายโคลอน เราจับคู่ทุกอย่างกับโคลอนแรกแล้วแทนค่านั้นสำหรับทั้งบรรทัด ดังนั้นเราจึงแยกชื่อผู้ใช้ออก

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

เราพิมพ์สิ่งต่อไปนี้:

sed 's / \ ([^:] * \) \ (. * \) / \ 2 /' / etc / passwd

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

ตอนนี้เรามาดูวิธีที่ง่ายและรวดเร็วในการดำเนินการนี้

ข้อความค้นหาของเรามาจากเครื่องหมายจุดคู่แรก ( :) ไปจนถึงท้ายบรรทัด เนื่องจากนิพจน์การแทนที่ของเราว่างเปล่า ( //) เราจะไม่แทนที่ข้อความที่ตรงกันด้วยอะไรเลย

ดังนั้นเราจึงพิมพ์สิ่งต่อไปนี้โดยตัดทุกอย่างตั้งแต่โคลอนแรก ( :) ไปจนถึงท้ายบรรทัดเหลือเพียงชื่อผู้ใช้:

sed 's /:.*// "/ etc / passwd

ลองดูตัวอย่างที่เราอ้างอิงการจับคู่ครั้งแรกและครั้งที่สองในคำสั่งเดียวกัน

เรามีไฟล์จุลภาค ( ,) คั่นชื่อและนามสกุล เราต้องการแสดงรายการเป็น "นามสกุล, ชื่อจริง" เราสามารถใช้  catดังที่แสดงด้านล่างเพื่อดูว่ามีอะไรอยู่ในไฟล์:

แมว geeks.txt

เช่นเดียวกับsedคำสั่งจำนวนมากคำสั่งถัดไปนี้อาจดูไม่สามารถยอมรับได้ในตอนแรก:

sed 's / ^ \ (. * \), \ (. * \) $ / \ 2, \ 1 / g' geeks.txt

คำสั่งนี้เป็นคำสั่งทดแทนเหมือนกับคำสั่งอื่น ๆ ที่เราเคยใช้และรูปแบบการค้นหานั้นค่อนข้างง่าย เราจะทำลายมันลงด้านล่าง:

  • sed 's/:คำสั่งการแทนที่ปกติ
  • ^:เนื่องจากคาเร็ตไม่ได้อยู่ในกลุ่ม ( []) จึงหมายถึง“ จุดเริ่มต้นของเส้น”
  • \(.*\),:นิพจน์ย่อยแรกคือจำนวนอักขระใด ๆ มันอยู่ในวงเล็บ [ ()] ซึ่งแต่ละอันนำหน้าด้วยแบ็กสแลช ( \) เพื่อให้เราสามารถอ้างอิงได้ด้วยตัวเลข รูปแบบการค้นหาทั้งหมดของเราแปลว่าการค้นหาจากจุดเริ่มต้นของบรรทัดจนถึงเครื่องหมายจุลภาคแรก ( ,) สำหรับอักขระจำนวนเท่าใดก็ได้
  • \(.*\):  นิพจน์ย่อยถัดไปคือ (อีกครั้ง) จำนวนอักขระใด ๆ นอกจากนี้ยังอยู่ในวงเล็บ [ ()] ซึ่งทั้งสองอย่างนี้นำหน้าด้วยแบ็กสแลช ( \) เพื่อให้เราสามารถอ้างอิงข้อความที่ตรงกันตามหมายเลขได้
  • $/:เครื่องหมายดอลลาร์ ( $) แสดงถึงจุดสิ้นสุดของบรรทัดและจะทำให้การค้นหาของเราดำเนินต่อไปจนถึงจุดสิ้นสุดของบรรทัด เราใช้สิ่งนี้เพื่อแนะนำเครื่องหมายดอลลาร์ เราไม่ต้องการที่นี่จริงๆเนื่องจากเครื่องหมายดอกจัน ( *) จะไปที่ท้ายบรรทัดในสถานการณ์นี้ เครื่องหมายทับ ( /) ทำให้ส่วนรูปแบบการค้นหาเสร็จสมบูรณ์
  • \2,\1 /g':เนื่องจากเราใส่นิพจน์ย่อยทั้งสองไว้ในวงเล็บเราจึงสามารถอ้างถึงทั้งสองนิพจน์ได้ด้วยตัวเลข second-match,first-matchเพราะเราต้องการที่จะกลับคำสั่งที่เราพิมพ์พวกเขาเป็น ตัวเลขจะต้องนำหน้าด้วยแบ็กสแลช ( \)
  • /g:สิ่งนี้ทำให้คำสั่งของเราทำงานได้ทั่วโลกในแต่ละบรรทัด
  • geeks.txt:ไฟล์ที่เรากำลังดำเนินการ

คุณยังสามารถใช้คำสั่ง Cut ( c) เพื่อแทนที่ทั้งบรรทัดที่ตรงกับรูปแบบการค้นหาของคุณ เราพิมพ์ข้อความต่อไปนี้เพื่อค้นหาบรรทัดที่มีคำว่า "คอ" และแทนที่ด้วยสตริงข้อความใหม่:

sed '/ คอ / c รอบข้อมือของฉันถูกบีบรัด' coleridge.txt

ตอนนี้บรรทัดใหม่ของเราจะปรากฏที่ด้านล่างของสารสกัดของเรา

การแทรกเส้นและข้อความ

เรายังสามารถแทรกบรรทัดและข้อความใหม่ลงในไฟล์ของเรา ในการแทรกบรรทัดใหม่หลังรายการที่ตรงกันเราจะใช้คำสั่ง Append ( a)

นี่คือไฟล์ที่เราจะใช้งาน:

แมว geeks.txt

เราได้กำหนดหมายเลขบรรทัดเพื่อให้ง่ายต่อการติดตาม

เราพิมพ์ข้อความต่อไปนี้เพื่อค้นหาบรรทัดที่มีคำว่า“ He” และแทรกบรรทัดใหม่ด้านล่าง:

sed '/ He / a -> แทรก!' geeks.txt

เราพิมพ์คำสั่งต่อไปนี้และรวมคำสั่งแทรก ( i) เพื่อแทรกบรรทัดใหม่เหนือคำสั่งที่มีข้อความที่ตรงกัน:

sed '/ He / i -> แทรก!' geeks.txt

เราสามารถใช้เครื่องหมายแอมเพอร์แซนด์ ( &) ซึ่งแสดงถึงข้อความเดิมที่ตรงกันเพื่อเพิ่มข้อความใหม่ในบรรทัดที่ตรงกัน \1 ,  \2และอื่น ๆ เป็นตัวแทน subexpressions จับคู่

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

ในการดำเนินการทั้งหมดนี้ให้พิมพ์ดังต่อไปนี้:

sed 's /.*/--> แทรก & /' geeks.txt

เราพิมพ์Gคำสั่งต่อไปนี้รวมถึงคำสั่งซึ่งจะเพิ่มบรรทัดว่างระหว่างแต่ละบรรทัด:

sed 'G' geeks.txt

หากคุณต้องการที่จะเพิ่มสองคนหรือมากกว่าบรรทัดว่างคุณสามารถใช้G;GG;G;Gและอื่น ๆ

การลบเส้น

คำสั่ง Delete ( d) ลบบรรทัดที่ตรงกับรูปแบบการค้นหาหรือที่ระบุด้วยหมายเลขบรรทัดหรือช่วง

ตัวอย่างเช่นหากต้องการลบบรรทัดที่สามเราจะพิมพ์ดังต่อไปนี้:

sed '3d' geeks.txt

หากต้องการลบช่วงของบรรทัดที่สี่ถึงห้าเราจะพิมพ์ดังต่อไปนี้:

sed '4,5d' geeks.txt

ในการลบบรรทัดนอกช่วงเราใช้เครื่องหมายอัศเจรีย์ ( !) ดังที่แสดงด้านล่าง:

sed '6,7! d' geeks.txt

บันทึกการเปลี่ยนแปลงของคุณ

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

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

เพื่อความสบายใจคุณsed สามารถสร้างการสำรองข้อมูลของไฟล์ต้นฉบับก่อนที่จะดำเนินการคำสั่ง

คุณสามารถใช้ตัวเลือก In-place ( -i) เพื่อบอก  sedให้เขียนการเปลี่ยนแปลงลงในไฟล์ต้นฉบับ แต่ถ้าคุณเพิ่มนามสกุลไฟล์sed จะสำรองไฟล์ต้นฉบับไปยังไฟล์ใหม่ มันจะมีชื่อเดียวกับไฟล์ต้นฉบับ แต่มีนามสกุลไฟล์ใหม่

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

ในการดำเนินการทั้งหมดนี้ให้พิมพ์ดังต่อไปนี้:

sed -i'.bak '' /^.*He.*$/d 'geeks.txt

เราพิมพ์ข้อมูลต่อไปนี้เพื่อให้แน่ใจว่าไฟล์สำรองของเราไม่มีการเปลี่ยนแปลง:

แมว geeks.txt.bak

นอกจากนี้เรายังสามารถพิมพ์ข้อความต่อไปนี้เพื่อเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ใหม่และได้ผลลัพธ์ที่คล้ายกัน:

sed -i'.bak '' /^.*He.*$/d 'geeks.txt> new_geeks.txt

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

แมว new_geeks.txt

มีเสน่ห์ทั้งหมดนั้น

อย่างที่คุณสังเกตเห็นแม้ไพรเมอร์แบบด่วนนี้sedจะค่อนข้างยาว คำสั่งนี้มีมากมายและยังมีอีกมากมายที่คุณสามารถทำได้ด้วยคำสั่งนี้

หวังว่าแนวคิดพื้นฐานเหล่านี้จะเป็นรากฐานที่มั่นคงซึ่งคุณสามารถสร้างได้เมื่อคุณเรียนรู้เพิ่มเติมต่อไป