sed - วิธีที่จะทำการทดแทนต่อเนื่องหลายรายการ แต่ประมวลผลไฟล์เพียงครั้งเดียว?


31

หากฉันกำลังทำการทดแทนหลายอย่างซึ่งจำเป็นต้องต่อเนื่องกันเช่น

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/' t1_spec.rb
sed -i '/expect(browser.*\.should/s/\.should/).should/' t1_spec.rb
sed -i 's/\.should/\.to/' t1_spec.rb 
sed -i 's/==/eq/' t1_spec.rb 

มีวิธีที่ดีกว่าในการทำเช่นนี้ที่จะผ่าน t1_spec.file เพียงครั้งเดียวและทำการทดแทน 4 ครั้งสำหรับแต่ละบรรทัดแทนที่จะไปผ่านไฟล์ 4 ครั้งหรือไม่

คำตอบ:


43

นอกเหนือจากการใช้เครื่องหมายอัฒภาคคุณสามารถให้นิพจน์มากกว่าหนึ่งนิพจน์โดยใช้-eแฟล็ก:

sed -i -e 's/expr1/replace1/' -e 's/expr2/replace2/'  t1_spec.rb 

14

ใน GNU (เช่นในเครื่อง Ubuntu ของฉัน) รองรับการใช้หลายบรรทัดและทำงานได้ดีและดูดี (imho) เพราะหลีกเลี่ยงสายยาวมากเช่น

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/
        /expect(browser.*\.should/s/\.should/).should/
        s/\.should/\.to/
        s/==/eq/' t1_spec.rb 

5

คุณสามารถใช้อัฒภาคเพื่อแยก substitions ที่แตกต่างกันระหว่างราคาเดียวหรือคุณสามารถใส่คำสั่งทั้งหมดที่อยู่ในแฟ้มและระบุไฟล์ที่มีตัวเลือกในการ-fsed

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

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