оболочка:Использование sed в обратных кавычках
Вопрос
Я хочу автоматически экранировать некоторые специальные символы внутри строки.Я подумал о том, чтобы повторить эту строку и пропустить ее через несколько 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