Làm thế nào để thoát đường dẫn tập tin trong SED?


39

Tôi muốn thay thế $fileWithPathtrong $file, tuy nhiên điều này không làm việc vì (tôi nghĩ) đường dẫn không trốn thoát. Làm thế nào để thoát khỏi nó?

sed -i 's/${fileWithPath}/HAHA/g' $file

Câu trả lời:


71
sed -i 's|'$fileWithPath'|HAHA|g' file

Dấu ngoặc đơn xác định một chuỗi bằng chữ. Đặt biến bên ngoài nghĩa đen cho phép vỏ mở rộng phần đó.

Ngoài ra: nếu bạn định phân tích các đường dẫn, hãy sử dụng một dấu phân cách trong lệnh sed không gây nhầm lẫn với dấu phân cách thư mục "/".


1
Coi chừng rằng nếu $fileWithPathchứa khoảng trắng, mẫu sai được chèn vào.
Lekensteyn

Mẹo thưởng của bạn về việc thay đổi dấu phân cách cho đường dẫn tệp là một trình tiết kiệm cuộc sống!
Shadoninja

Tôi nghĩ rằng bạn có quá nhiều trích dẫn trong lệnh của bạn. Ví dụ của tôi sed -i 's|auth-user-pass nordvpn.txt|auth-user-pass /etc/openvpn/nordvpn.txt|g' *.ovpndường như làm việc.
Léo Léopold Hertz ngày

14

Một cách tốt hơn cho các chuỗi chữ có dấu gạch chéo về phía trước:

sed -i "s|my/path|my/other/path|g" myFileOfPaths.txt

Điều này xứng đáng một giải Oscar! Đơn giản và thanh lịch
Toàn Nguyễn

14

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 # - sự lựa chọn tốt nhất của ký tự phân định 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#'$fileWithPath'#HAHA#g' $file

Ký tự 'g' sau # cuối được sử dụng để thay đổi tất cả các lần xuất hiện trong tệp nếu bạn chỉ cần thay đổi lần xuất hiện đầu tiên sau đó xóa '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.