Làm thế nào để sed và thay thế chuỗi bằng một đường dẫn thư mục


14

Tôi đang cố gắng viết kịch bản bash sau đây:

HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;

Dòng mà tôi muốn được thay đổi trong các tệp là đây:

users                   = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"

Vì vậy, kết quả cuối cùng phải là:

users                   = "/opt/my_home/config/data/_DOMAIN_/users.conf"

Nhưng tôi không hiểu điều đó ... Tôi đoán đó là vì ký tự thoát ...

Bất cứ ai có thể làm sáng tỏ?

Cảm ơn


ý bạn là, s (h) ed một số ánh sáng
Alexandre Holden Daly

Câu trả lời:


23

Trong trường hợp chuỗi thay thế hoặc chuỗi mẫu có dấu gạch chéo, bạn có thể sử dụng thực tế là GNU sed cho phép một dấu phân cách thay thế cho lệnh thay thế. Các lựa chọn phổ biến cho dấu phân cách là ký tự ống |hoặc hàm băm #- lựa chọn tốt nhất của ký tự phân cách thường sẽ phụ thuộc vào loại tệp được xử lý. Trong trường hợp của bạn, bạn có thể thử

sed -i "s#_HOME_DIR_#$HOME_DIR#"

Cũng lưu ý rằng bạn đã nhập sai tên biến của mình $ HOME_DIR (tên này không bắt đầu bằng dấu gạch dưới).

$ HOME_DIR=/opt/my_home
$ echo "_HOME_DIR_/config/data/_DOMAIN_/users.conf" | sed "s#_HOME_DIR_#$HOME_DIR#"
/opt/my_home/config/data/_DOMAIN_/users.conf

Chỉ cần fyi bạn có thể muốn tránh sử dụng all-caps cho các biến người dùng trong tập lệnh của mình - chúng nên được dành riêng cho các biến hệ thống. Ngoài ra, gcông tắc là không cần thiết trừ khi bạn muốn thực hiện nhiều thay thế trên một dòng.


0

Mã hóa biến 'opt / home' sẽ hoạt động như thế này ..

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
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.