Назад | Перейти на главную страницу

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

может кто-нибудь может мне помочь. Спасибо

Сначала вам нужно процитировать ваш 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