Я пытаюсь найти и заменить определенное текстовое содержимое с помощью команды sed и запустить его с помощью сценария оболочки.
Ниже приведен пример сценария, который я использую:
fp=/asd/filename.txt
fd="sed -i -E 's ($2).* $2:$3 g' ${fp}"
eval $fd
и выполнить то же самое, передав аргументы:
./test.sh update asd asdfgh
Но если строка аргумента содержит $
, она прерывает команды и заменяет неправильные значения, такие как
./test.sh update asd $apr1$HnIF6bOt$9m3NzAwr.aG1Yp.t.bpIS1.
Как я могу убедиться, что значения внутри переменных не раскрыты из-за $
?
Обновлено
sh file test.sh
set -xv
fp="/asd/filename.txt"
sed -iE "s/(${2//'$'/'\$'}).*/${2//'$'/'\$'}:${3//'$'/'\$'}/g" "$fp"
текстовый файл filename.txt
hello:world
Выходы
1) ./test.sh update hello WORLD
sed -iE "s/(${2//'$'/'\$'}).*/${2//'$'/'\$'}:${3//'$'/'\$'}/g" "$fp"
++ sed -iE 's/(hello).*/hello:WORLD/g' /asd/filename.txt
2) ./test.sh update hello '$ apr1 $ hosgaxyv $ D0KXp5dCyZ2BUYCS9BmHu1 '
sed -iE "s/(${2//'$'/'\$'}).*/${2//'$'/'\$'}:${3//'$'/'\$'}/g" "$fp"
++ sed -iE 's/(hello).*/hello:'\''$'\''apr1'\''$'\''hosgaxyv'\''$'\''D0KXp5dCyZ2BUYCS9BmHu1/g' /asd/filename.txt
В обоих случаях его содержимое не заменяется