SED в скрипте Bash: как заменить текст специальным символом, полученным из переменной в скрипте Bash

SED в скрипте Bash: как заменить текст специальным символом, полученным из переменной в скрипте Bash

Во-первых, в скрипте 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 ... -execwith {}, мне не нравится этот синтаксис, я обычно заканчиваю его\;

Я предпочитаю использовать xargs

find . -name list.txt | xargs sed -i 's/1234/var&2018+&/g'

обратите внимание, что окончание g заменит его столько раз, сколько оно будет найдено...

также это может быть очевидно.. Я не знаю, сколько list.txtфайлов у вас в поддереве, но если у вас только один, то вам не нужен find.

sed -i 's/pattern/replacement/options' filename

Связанный контент