วิธีใช้คำสั่ง 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
หมายถึง“พิมพ์บรรทัดจับคู่.” โดยค่าเริ่มต้น พิมพ์ทุกบรรทัด เราจะเห็นข้อความทั้งหมดในไฟล์พร้อมกับพิมพ์บรรทัดที่ตรงกันสองครั้ง เพื่อป้องกันปัญหานี้เราจะใช้ตัวเลือก (เงียบ) เพื่อระงับข้อความที่ไม่ตรงกัน4
p
sed
-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;G
, G;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
จะค่อนข้างยาว คำสั่งนี้มีมากมายและยังมีอีกมากมายที่คุณสามารถทำได้ด้วยคำสั่งนี้
หวังว่าแนวคิดพื้นฐานเหล่านี้จะเป็นรากฐานที่มั่นคงซึ่งคุณสามารถสร้างได้เมื่อคุณเรียนรู้เพิ่มเติมต่อไป