Tại sao sed không thay thế tất cả các lần xuất hiện?


118

Nếu tôi chạy mã này trong bash:

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

nó cho đầu ra:

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 gcờ thay thế toàn cầu, bạn cũng không cần -rtùy chọn ở đây.
Chris Seymour

Câu trả lời:


188

Bạn nên thêm công cụ gsửa đổi để sed thực hiện thay thế toàn bộ nội dung của bộ đệm mẫu:

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

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

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


1
Thêm một trường hợp góc cho GNU sed ở đây: sed -E 's,foo,bar,g'không làm điều toàn cầu. Nếu bạn thay đổi nó để sed -E -e 's,foo,bar,g'nó hoạt động.
Melvyn Sopacua

23

Bạn phải đặt gcuối cùng, 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 vì sed -r, không tồn tại.
Dylan Daniels

1
@DylanDaniels Theo man sedtrên Ubuntu, -rtùy chọn này 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 biểu thức chính quy mở rộng để hoạt động.
Craig McQueen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.