2013-04-06 31 views
75

Nếu tôi chạy mã này trong bash:Tại sao sed không thay thế tất cả các lần xuất hiện?

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

nó mang lại cho sản lượng:

log dog dos 

Làm thế nào tôi có thể làm cho nó thay thế tất cả các lần xuất hiện của con chó?

+2

Bạn cần 'cờ g' sử dụng quyền thay toàn cầu, bạn không cần' tùy chọn -r' đây hoặc . –

Trả lời

122

Bạn nên thêm modifier g để sed thực hiện một toàn cầu thay thế các nội dung của bộ đệm mẫu :

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

Để có tài liệu tuyệt vời về sed, hãy kiểm tra http://www.grymoire.com/Unix/Sed.html. toàn cầu cờ này được giải thích ở đây: http://www.grymoire.com/Unix/Sed.html#uh-6

Các tài liệu chính thức cho GNU sed có sẵn tại http://www.gnu.org/software/sed/manual/

+0

Cảm ơn bạn, đã làm việc :) – niagr

18

Bạn cần phải đặt một g ở cuối, nó là viết tắt của "toàn cầu":

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

sed -e nên được sử dụng thay cho sed -r, mà không tồn tại. –

+0

@DylanDaniels Theo 'man sed' trên Ubuntu, tùy chọn' -r' có nghĩa là "sử dụng các biểu thức chính quy mở rộng". Vì vậy, lệnh đã cho hoạt động tốt, mặc dù nó không cần các tính năng của các biểu thức chính quy mở rộng để hoạt động. –

Các vấn đề liên quan