Bash не работает sed на замену переменной

Столкнулся с проблемой: нужно заменить значение в переменной файла. Условно пусть есть перменная uno=1 dos=2. В тексте нужно заменить uno на dos. При использовании команды sed по принципу замены текста

echo "This is 1 This is 2" | sed 's%1%2%g'

команда работает

При попытке выполнения

echo " This is $uno This is $dos"

вывод работает, т.е. переменные определены, но при попытке замены с помощью sed - замена не производится. Для sed использовалась команда:

echo "This is $uno This is $dos" | sed 's%$(uno)%$(dos)'

Теоретически такая команда должна вывести текст "This is 2 This is 2", но выводится обычный текст. В чем может быть моя ошибка?


Ответы (1 шт):

Автор решения: ipatev_nn

Ошибки в команде:

... | sed 's%$(uno)%$(dos)%'
# отсутствует разделитель_^

Используется одинарные кавычки. Например, отличие одинарных кавычек от двойных:

var='str'
echo '$var'
>>> $var
echo "$var"
>>> str

Неверный вызов переменных:

var='ls'
echo "$(var)"
#______^___^ использование круглых скобок предназначено для вызова программ и команд
>>> var: команда не найдена
echo "$var"
>>> ls
echo "${var}"
>>> ls

Использование фигурных скобок зачастую помогает в ограничении имени переменной, к примеру, у нас есть 3 каталога - masterdir, slavedir, otherdir. В результате работы некоего скрипта мы получаем значение - master, slave или other соответственно. И что бы правильно получить имя каталога, к переменной нужно присоединить текст dir

var='master'
echo "/path/$vardir"
>>> /path/
#Так как переменной $vardir не объявлено, то и вывод будет пустой
echo "/path/${var}dir"
>>> /path/masterdir
→ Ссылка