Выйдите из строки для шаблона замены sed

295
задан codeforester 7 July 2018 в 06:57
поделиться

3 ответа

Warning: не учитывает новые строки. Чтобы получить более подробный ответ, обратитесь к этому SO-вопросу. (Спасибо, Эд Мортон и Никлас Петер)

Обратите внимание, что экранирование всего - плохая идея. Sed требует экранирования многих символов, чтобы получить их специальное значение. Например, если вы экранируете цифру в строке замены, она превратится в обратную ссылку.

Как сказал Бен Бланк, в строке замены нужно экранировать только три символа (сами символы, прямая косая черта для конца утверждения и & для замены всех):

sed -e 's/[\/&]/\\&/g'

Если вам когда-нибудь понадобится экранировать строку KEYWORD, вам понадобится следующее:

sed -e 's/[]\/$*.^[]/\\&/g'

Помните, если вы используете в качестве разделителя символ, отличный от /, вам нужно заменить косую черту в выражениях выше на символ, который вы используете. См. комментарий PeterJCLaw для объяснения.

Отредактировано: Из-за некоторых угловых случаев, ранее не учтенных, приведенные выше команды несколько раз изменялись. Подробности смотрите в истории правок.

248
ответ дан 23 November 2019 в 01:34
поделиться

Только три буквенных символа, которые рассматривают особенно в пункте замены, / (для закрытия пункта), \ (к символам 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
44
ответ дан Mark Stosberg 23 November 2019 в 01:34
поделиться

Вот пример 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.

0
ответ дан Alex 23 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: