Cảnh báo : Điều này không xem xét các dòng mới. Để có câu trả lời sâu hơn, thay vào đó hãy xem câu hỏi SO này . (Cảm ơn, Ed Morton & Niklas Peter)
Lưu ý rằng thoát khỏi mọi thứ là một ý tưởng tồi. Sed cần nhiều nhân vật để được trốn thoát để có được ý nghĩa đặc biệt của chúng. Ví dụ: nếu bạn thoát một chữ số trong chuỗi thay thế, nó sẽ chuyển sang trạng thái phản hồi.
Như Ben Blank đã nói, chỉ có ba ký tự cần được thoát trong chuỗi thay thế (tự thoát, gạch chéo về phía trước để kết thúc câu lệnh và & thay thế tất cả):
ESCAPED_REPLACE=$(printf '%s\n' "$REPLACE" | sed -e 's/[\/&]/\\&/g')
# Now you can use ESCAPED_REPLACE in the original sed statement
sed "s/KEYWORD/$ESCAPED_REPLACE/g"
Nếu bạn cần thoát KEYWORD
chuỗi, sau đây là chuỗi bạn cần:
sed -e 's/[]\/$*.^[]/\\&/g'
Và có thể được sử dụng bởi:
KEYWORD="The Keyword You Need";
ESCAPED_KEYWORD=$(printf '%s\n' "$KEYWORD" | sed -e 's/[]\/$*.^[]/\\&/g');
# Now you can use it inside the original sed statement to replace text
sed "s/$ESCAPED_KEYWORD/$ESCAPED_REPLACE/g"
Hãy nhớ rằng, nếu bạn sử dụng một ký tự không phải /
là dấu phân cách, bạn cần thay thế dấu gạch chéo trong các biểu thức ở trên với ký tự bạn đang sử dụng. Xem bình luận của PeterJCLaw để được giải thích.
Đã chỉnh sửa: Do một số trường hợp góc trước đây không được tính, các lệnh trên đã thay đổi nhiều lần. Kiểm tra lịch sử chỉnh sửa để biết chi tiết.