Во-первых, в скрипте bash есть переменная, содержащая специальный символ. Вот пример. list.txt:
user = root
password = 1234
Скрипт Bash:
#!/bin/sh
var1 = var&2018+&
find . -name "list.txt" -exec sed -i "s/1234/"$var1"/g" {} +
Когда я выполнил скрипт, результат был следующим: var12342018+1234.
Обновление 1 (ответ Олива):
var1='var&2018+&'
find . -name "*list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;
и результат тот же: пароль = var12342018+1234
может быть, кто-нибудь сможет мне помочь. Спасибо.
решение1
Сначала вам нужно заключить вашу var1
переменную в кавычки.
Вы можете использовать bash -c
в своей find
команде, чтобы задать пароль как переменную:
var1='var\&2018+\&'
find . -name "list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;
решение2
Возможно, вам будет легче понять проблему, если вы узнаете, что &
это специальный символ, представляющий все совпадение вашего регулярного выражения.
поскольку 1234
найдено, вы заменяете его на var12342018+1234
, и эти два символа &
становятся совпадающей строкой.
Другой момент, который я хотел бы отметить, на самом деле является личным предпочтением, но использование find ... -exec
with {}
, мне не нравится этот синтаксис, я обычно заканчиваю его\;
Я предпочитаю использовать xargs
find . -name list.txt | xargs sed -i 's/1234/var&2018+&/g'
обратите внимание, что окончание g заменит его столько раз, сколько оно будет найдено...
также это может быть очевидно.. Я не знаю, сколько list.txt
файлов у вас в поддереве, но если у вас только один, то вам не нужен find
.
sed -i 's/pattern/replacement/options' filename