Пропущенный обратный слеш в файле при замене содержимого строки с помощью обратного слеша содержит переменную

Я хочу записать обратный слеш в файл и пытаюсь заменить некоторый текст на значение из переменной:

$ 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.

1
задан 17 April 2021 в 17:08

2 ответа

Это sed интерпретация \ в вашей переменной как escape-символ. Вы можете экранировать специальные символы, используя printf% q :

sed -i "s/target_value/$(printf %q "$TEST")/" test.txt 

В качестве альтернативы, ваш сценарий работал бы, если бы вы определили свою переменную как:

TEST='\\etc\\hello'

Обратите внимание на одинарные кавычки вокруг sting, что вызывает $ TEST , чтобы содержать буквальную строку.

1
ответ дан 23 April 2021 в 23:21

Вы можете использовать подстановку параметров оболочки, чтобы избежать обратных слэшей. Исх.:

$ 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

См. также:

1
ответ дан 23 April 2021 в 23:21

Другие вопросы по тегам:

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