ทำการแก้ไขหลายรายการด้วยการโทรเพียงครั้งเดียวเพื่อระงับ


16

ฉันพยายามใช้ sed เพื่อแก้ไขไฟล์กำหนดค่า มีบางบรรทัดที่ฉันต้องการเปลี่ยน ฉันรู้ว่าภายใต้ Linux sed -iอนุญาตให้แก้ไขได้ แต่คุณต้องบันทึกลงในไฟล์สำรอง อย่างไรก็ตามฉันต้องการหลีกเลี่ยงการมีไฟล์สำรองหลายไฟล์และทำให้การเปลี่ยนแปลงทั้งหมดของฉันพร้อมกัน

มีวิธีที่จะทำกับsed -iหรือมีทางเลือกที่ดีกว่า?

คำตอบ:


22

คุณสามารถบอกsedให้ดำเนินการหลายอย่างโดยทำซ้ำ-e(หรือ-fถ้าสคริปต์ของคุณอยู่ในไฟล์)

sed -i -e 's/a/b/g' -e 's/b/d/g' fileทำให้การเปลี่ยนแปลงทั้งสองในไฟล์เดียวชื่อfileแทน ไม่มีไฟล์สำรอง

sed -ibak -e 's/a/b/g' -e 's/b/d/g' fileทำให้การเปลี่ยนแปลงทั้งสองในไฟล์เดียวชื่อfileแทน ด้วยไฟล์สำรองข้อมูลชื่อfilebakเดียว


2
โปรดสังเกตว่าลำดับสำคัญ ตัวอย่างเช่นในคำสั่งดังกล่าวข้างต้นอินสแตนซ์ทั้งหมดของตัวอักษรที่aจะกลายเป็นbและแล้วทุกกรณีจะกลายเป็นb dคุณสามารถทำสิ่งเดียวกันกับsed -i -e 's/a\|b/d/g' file-Turn ทุกกรณีอย่างใดอย่างหนึ่งaหรือเข้าไปb d
Wildcard

4

ทางเลือกหนึ่งคือผู้บุกเบิกการex viมันเป็นจริงเครื่องมือ POSIX ของทางเลือกสำหรับการแก้ไขไฟล์ในสถานสคริปต์; มีความยืดหยุ่นมากกว่าและพกพาได้ง่ายกว่า Perl (ถ้าคุณอยู่นอกโลกของ Windows ก็ไม่สามารถเถียงได้พกพามากขึ้นกว่า Perl.)sed -i

มีความขาดแคลนญาติ stackexchange ของตัวอย่างนี้คำสั่งที่ใช้เป็นexอย่างน้อยเมื่อเทียบกับมากมายเหลือเฟือของคำสั่งตัวอย่างโดยใช้sed, awkและ Perl อย่างไรก็ตามตัวฉันเองได้ทำการเจาะลึกข้อมูลจำเพาะ POSIXexอย่างกว้างขวางและฉันก็ตีกลองมานานแล้ว ฉันได้เขียนคำตอบมากมายโดยใช้exทั้งที่นี่และใน vi / Vim stackexchange:

อ่านเพิ่มเติม:


3

เช่นเดียวกับการใช้หลาย-eตัวเลือกคุณยังสามารถแยกคำสั่ง sed ในสคริปต์ sed เดียวโดยใช้บรรทัดใหม่หรือเซมิโคลอน

ในกรณีนี้ไม่ว่าสคริปต์นั้นจะเป็นหนึ่งซับในบรรทัดคำสั่งหรือไฟล์สคริปต์

เช่น

sed -e 's/a/b/g ; s/b/d/g' file

อักขระช่องว่างรอบ ๆ;เป็นตัวเลือก ฉันใช้มันที่นี่เพื่อให้แน่ใจว่าเซมิโคลอนโดดเด่น (โดยทั่วไปยกเว้นบรรทัดใหม่ที่คั่นคำสั่ง white-space ระหว่างคำสั่งจะถูกละเว้น ... แต่อย่าลืมว่า white space ภายในคำสั่งอาจเป็นและปกติคือ อย่างมีนัยสำคัญ)

หรือ:

sed -e 's/a/b/g
        s/b/d/g' file
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.