ทำไม sed ไม่แทนที่สิ่งที่เกิดขึ้นทั้งหมด?


118

ถ้าฉันเรียกใช้รหัสนี้ใน bash:

echo dog dog dos | sed -r 's:dog:log:'

ให้ผลลัพธ์:

log dog dos

ฉันจะทำให้มันแทนที่เหตุการณ์ทั้งหมดของสุนัขได้อย่างไร


2
คุณต้องการgแฟล็กสำหรับการเปลี่ยนตัวทั่วโลกคุณไม่จำเป็นต้องมี-rตัวเลือกที่นี่เช่นกัน
Chris Seymour

คำตอบ:


188

คุณควรเพิ่มgตัวปรับแต่งเพื่อให้ sed ทำการแทนที่เนื้อหาทั่วโลกของบัฟเฟอร์รูปแบบ:

echo dog dog dos | sed -e 's:dog:log:g'

สำหรับเอกสารที่ยอดเยี่ยมใน sed ตรวจสอบhttp://www.grymoire.com/Unix/Sed.html ธงสากลนี้มีคำอธิบายที่นี่: http://www.grymoire.com/Unix/Sed.html#uh-6

ดูเอกสารอย่างเป็นทางการGNU sedได้ที่http://www.gnu.org/software/sed/manual/


1
การเพิ่มกรณีมุมสำหรับ GNU sed ที่นี่: sed -E 's,foo,bar,g'ไม่ได้ทำในระดับโลก ถ้าคุณเปลี่ยนมันsed -E -e 's,foo,bar,g'ใช้งานได้
Melvyn Sopacua

23

คุณต้องใส่gท้ายมันย่อมาจาก "global":

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^

1
ควรใช้ sed -e แทน sed -r ซึ่งไม่มีอยู่
Dylan Daniels

1
@DylanDaniels อ้างอิงจากman sedบน Ubuntu -rตัวเลือกหมายถึง "ใช้นิพจน์ทั่วไปแบบขยาย" ดังนั้นคำสั่งที่กำหนดจึงทำงานได้ดีแม้ว่าจะไม่ต้องการคุณสมบัติของนิพจน์ทั่วไปที่ขยายออกไปในการทำงาน
Craig McQueen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.