Warning: не учитывает новые строки. Чтобы получить более подробный ответ, обратитесь к этому SO-вопросу. (Спасибо, Эд Мортон и Никлас Петер)
Обратите внимание, что экранирование всего - плохая идея. Sed требует экранирования многих символов, чтобы получить их специальное значение. Например, если вы экранируете цифру в строке замены, она превратится в обратную ссылку.
Как сказал Бен Бланк, в строке замены нужно экранировать только три символа (сами символы, прямая косая черта для конца утверждения и & для замены всех):
sed -e 's/[\/&]/\\&/g'
Если вам когда-нибудь понадобится экранировать строку KEYWORD
, вам понадобится следующее:
sed -e 's/[]\/$*.^[]/\\&/g'
Помните, если вы используете в качестве разделителя символ, отличный от /
, вам нужно заменить косую черту в выражениях выше на символ, который вы используете. См. комментарий PeterJCLaw для объяснения.
Отредактировано: Из-за некоторых угловых случаев, ранее не учтенных, приведенные выше команды несколько раз изменялись. Подробности смотрите в истории правок.
Только три буквенных символа, которые рассматривают особенно в пункте замены, /
(для закрытия пункта), \
(к символам ESC, обратной ссылке, & c.), и &
(для включения соответствия в замену). Поэтому все, что необходимо сделать, выйти из тех трех символов:
sed "s/KEYWORD/$(echo $REPLACE | sed -e 's/\\/\\\\/g; s/\//\\\//g; s/&/\\\&/g')/g"
Пример:
$ export REPLACE="'\"|\\/><&!"
$ echo fooKEYWORDbar | sed "s/KEYWORD/$(echo $REPLACE | sed -e 's/\\/\\\\/g; s/\//\\\//g; s/&/\\\&/g')/g"
foo'"|\/><&!bar
Вот пример AWK, который я использовал только что. Это - AWK, который печатает новый AWKS. AWK и SED быть подобным это может быть хороший шаблон.
ls | awk '{ print "awk " "'"'"'" " {print $1,$2,$3} " "'"'"'" " " $1 ".old_ext > " $1 ".new_ext" }' > for_the_birds
Это выглядит чрезмерным, но так или иначе что комбинация кавычек работает для хранения 'печатной как литералы. Тогда, если я помню правильно, что vaiables просто окружаются кавычками как это: "1$". Попробуйте его, сообщите мне, как это работает с SED.