как обрабатывать обратную косую черту, используемую в sed - PullRequest
1 голос
/ 22 сентября 2011

см. Эти простые команды:

$ echo $tmp
UY\U[_
$ echo "a" | sed "s|a|${tmp}|g"
UY[_

см? "\ U" съедено. другие обратные слеши тоже не выживут.

вопрос в том, как заставить вышеуказанную команду работать как положено?

пожалуйста, обратите внимание, что код не является реальным решением; я просто делаю это простым для объяснения. Я должен использовать переменную, и переменная обязательно имеет обратную косую черту.

пожалуйста, прокомментируйте. спасибо!

XM

Ответы [ 2 ]

3 голосов
/ 22 сентября 2011

Если только «обратная косая черта» «съедается» с помощью sed и экранирования достаточно, попробуйте:

echo "a" | sed "s|a|${tmp//\\/\\\\}|g"

Достаточно сбить вас с толку?\\ представляет одиночный символ \, поскольку его также необходимо экранировать в оболочке.Начальный // похож на модификатор g в s/foo/bar/g, если вы хотите заменить только первый встречающийся шаблон, пропустите его.

Документы о ${parameter/pattern/string} доступны здесь: http://www.gnu.org/s/bash/manual/bash.html#Shell-Parameter-Expansion

Редактировать: В зависимости от того, что вы хотите сделать, вам лучше не использовать sed для этого на самом деле.

$ tmp="UY\U[_"
$ in="a"
$ echo ${in//a/$tmp}
UY\U[_
1 голос
/ 22 сентября 2011

Вы можете обработать сам $ tmp через sed

echo "a" | sed "s|a|$(echo ${tmp} | sed 's|\\|\\\\|g')|g"
...