Я хочу записать обратный слеш в файл и пытаюсь заменить некоторый текст на значение из переменной:
$ TEST=\\etc\\hello
$ echo $TEST
\etc\hello
Но обратный слеш пропускается, когда я привязываю его, используя sed -i
$ sed -i "s/target_value/$TEST/" $(pwd)/test.txt
results "etchello" in test.txt
Я ожидаю, что файл будет содержать \etc\hello
.
Это sed
интерпретация \
в вашей переменной как escape-символ. Вы можете экранировать специальные символы, используя printf% q
:
sed -i "s/target_value/$(printf %q "$TEST")/" test.txt
В качестве альтернативы, ваш сценарий работал бы, если бы вы определили свою переменную как:
TEST='\\etc\\hello'
Обратите внимание на одинарные кавычки вокруг sting, что вызывает $ TEST
, чтобы содержать буквальную строку.
Вы можете использовать подстановку параметров оболочки, чтобы избежать обратных слэшей. Исх.:
$ set -x
+ set -x
$ echo 'foo target_value bar' | sed "s/target_value/${TEST//\\/\\\\}/"
+ echo 'foo target_value bar'
+ sed 's/target_value/\\etc\\hello/'
foo \etc\hello bar
См. также: