во-первых, есть переменная, содержащая специальный символ в сценарии 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
может кто-нибудь может мне помочь. Спасибо
Сначала вам нужно процитировать ваш var1
переменная.
Ты можешь использовать bash -c
в твоем find
команда, чтобы передать пароль в виде переменной:
var1='var\&2018+\&'
find . -name "list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;
это может помочь вам понять проблему, которую вы должны знать, что &
- это специальный символ, который представляет собой полное совпадение вашего регулярного выражения.
поскольку 1234
найдено, вы заменяете его на var12342018+1234
, два &
становится совпадающей строкой.
другой момент, который я хотел бы отметить, на самом деле является личным предпочтением, но использование find ... -exec
с участием {}
, мне не нравится этот синтаксис, я обычно заканчиваю его \;
Я предпочитаю использовать xargs
find . -name list.txt | xargs sed -i 's/1234/var&2018+&/g'
обратите внимание, что окончание g заменяет его столько раз, сколько встречается ...
также это может быть очевидно .. Я не знаю, сколько list.txt
файл, который у вас есть в поддереве, но если у вас есть только один, вам не нужно find
.
sed -i 's/pattern/replacement/options' filename