оболочка:Использование sed в обратных кавычках

StackOverflow https://stackoverflow.com/questions/1492457

  •  18-09-2019
  •  | 
  •  

Вопрос

Я хочу автоматически экранировать некоторые специальные символы внутри строки.Я подумал о том, чтобы повторить эту строку и пропустить ее через несколько sed.Кажется, это не работает внутри обратных кавычек.Так почему же

echo "foo[bar]" | sed 's/\[/\\[/g'

возвращаться

foo\[bar]

но

FOO=`echo "foo[bar]" | sed 's/\[/\\[/g'` && echo $FOO

просто возвращается

foo[bar]

?

В отличие от sed, tr отлично работает внутри обратных кавычек:

FOO=`echo "foo[bar]" | tr '[' '-' ` && echo $FOO

возвращает

foo-bar]
Это было полезно?

Решение

Вам нужно избегать обратных косых черт между обратными кавычками.

FOO=`echo "foo[bar]" | sed 's/\\[/\\\\[/g'` && echo $FOO

В качестве альтернативы используйте $() (на самом деле это рекомендуемый метод).

FOO=$(echo "foo[bar]" | sed 's/\[/\\[/g') && echo $FOO

Другие советы

Как насчет того, чтобы не использовать обратные кавычки, а использовать $() ?

FOO=$(echo "foo[bar]" | sed 's/\[/\\[/g') && echo $FOO

если вы настаиваете на использовании обратных кавычек, я думаю, вам нужно дополнительно экранировать все \ в двойные \

FOO=`echo "foo[bar]" | sed 's/\\[/\\\\[/g'` && echo $FOO

Обычно это случай недостаточного экранирования

FOO=`echo "foo[bar]" | sed 's/\[/\\\[/g'` && echo $FOO
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top