Предупреждение : это не учитывает переводы строки. Для более подробного ответа см. Этот SO-вопрос . (Спасибо, Эд Мортон и Никлас Питер)
Обратите внимание, что избегать всего - плохая идея. SED потребность много символов , чтобы быть экранированы , чтобы получить свой особый смысл. Например, если вы укажете цифру в строке замены, она превратится в обратную ссылку.
Как сказал Бен Бланк, в заменяющей строке необходимо экранировать только три символа (экранирование, косая черта для конца оператора и & для замены всего):
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"
Если вам когда-либо понадобится экранировать KEYWORD
строку, вам понадобится следующее:
sed -e 's/[]\/$*.^[]/\\&/g'
И может быть использован:
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"
Помните, что если вы используете символ, отличный от /
разделителя, вам необходимо заменить косую черту в приведенных выше выражениях на используемый вами символ. См. Комментарий PeterJCLaw для объяснения.
Отредактировано: из-за некоторых угловых случаев, ранее не учтенных, вышеприведенные команды менялись несколько раз. Проверьте историю изменений для деталей.