Làm thế nào để thay thế một dấu ngoặc trái với sed?


27

Tôi phải thay thế (bằng một số ký tự trong tệp của mình và tôi không thể làm điều đó. \(được sử dụng để nhóm trong sed và khi tôi sử dụng \\(với sed, nó coi nó như một \(nhân vật không chỉ là như vậy (. Nó có vẻ như là một trường hợp khó khăn với tôi.


7
Gợi ý: nếu bạn chỉ muốn thay thế một ký tự cho một ký tự khác, hãy sử dụng tr(anslate) : echo 'Hello (world)' | tr '()' '[]'; nó đầu ra Hello [world].
Lekensteyn

Câu trả lời:


45

Nếu bạn sử dụng sed mà không có -r (biểu thức chính quy mở rộng), nó sẽ hoạt động như nó sử dụng \(\)chứ không phải ()để nhóm:

sed -e 's/(/X/g'

Ví dụ

$ echo "foo (bar) (baz)" | sed -e 's/(/X/g'
foo Xbar) Xbaz)

Nếu bạn muốn sử dụng, -rbạn có thể đặt (bên trong [], vd

sed -re 's/[(]/X/g'

Như Lekensteyn nhận xét sử dụng trcó thể thích hợp hơn khi bạn được chỉ đơn thuần là thay thế và bạn không cần phải toàn bộ sức mạnh của biểu thức thông thường.


TL; DR: Đừng thoát khỏi nó.
qwertzguy

Tôi đã sử dụng điều này để thay thế chức năng "split" không dùng nữa của php bằng chức năng "explode", đảm bảo "split" được đặt trước một khoảng trắng và theo sau là "(".grep -lRZ " split(" . | xargs -0 sed -i -e 's/ split(/ explode(/g'
Butussy Butkus
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.