Заменить строку в сценарии оболочки, используя переменную
Я использую приведенный ниже код для замены строки внутри сценария оболочки.
echo $LINE | sed -e 's/12345678/"$replace"/g'
но это заменяется $replace
вместо значения этой переменной.
Кто-нибудь может сказать, что пошло не так?
13 ответов
Если вы хотите интерпретировать $replace
Вы не должны использовать одинарные кавычки, так как они предотвращают подстановку переменных.
Пытаться:
echo $LINE | sed -e "s/12345678/\"${replace}\"/g"
при условии, что вы хотите вставить цитаты. Если вы не хотите цитаты, используйте:
echo $LINE | sed -e "s/12345678/${replace}/g"
Стенограмма:
pax> export replace=987654321
pax> echo X123456789X | sed "s/123456789/${replace}/"
X987654321X
pax> _
Просто будьте осторожны, чтобы ${replace}
не имеет каких-либо значимых символов для sed
(лайк /
например), поскольку это вызовет путаницу, если не избежать. Но если, как вы говорите, вы заменяете один номер другим, это не должно быть проблемой.
Вы можете использовать оболочку (bash/ksh).
$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
Не специфично для вопроса, но для людей, которым нужна такая же функциональность, расширенная для ясности из предыдущих ответов:
str="someFileName.foo"
find=".foo"
replace=".bar"
result=${str//$find/$replace}
echo $result
# result is: someFileName.bar
str="someFileName.sally"
find=".foo"
replace=".bar"
result=${str//$find/$replace}
echo $result
# result is: someFileName.sally because ".foo" was not found
Одиночные кавычки очень сильны. Оказавшись внутри, вы ничего не можете сделать, чтобы вызвать подстановку переменных, пока вы не уйдете. Вместо этого используйте двойные кавычки:
echo $LINE | sed -e "s/12345678/$replace/g"
Приведу два примера.
- Используя sed:
#!/bin/bash
LINE="12345678HI"
replace="Hello"
echo $LINE | sed -e "s/12345678/$replace/g"
- Без использования sed:
LINE="12345678HI"
str_to_replace="12345678"
replace_str="Hello"
result=${str//$str_to_replace/$replace_str}
echo $result
Надеюсь, вы найдете это полезным!
echo $LINE | sed -e 's/12345678/'$replace'/g'
вы все еще можете использовать одинарные кавычки, но вы должны "открывать" их, когда хотите, чтобы переменная раскрывалась в нужном месте. в противном случае строка принимается "буквально" (как правильно сказал @paxdiablo, его ответ также верен)
Чтобы ваша оболочка раскрыла переменную, вам нужно использовать двойные кавычки, такие как
sed -i "s#12345678#$replace#g" file.txt
Это сломается, если $replace
содержать специальные sed
персонажи (#
, \
). Но вы можете предварительно обработать $replace
процитировать их:
replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g')
sed -i "s#12345678#$replace_quoted#g" file.txt
используйте @, если вы хотите заменить такие вещи, как /. $ и т. д.
result=$(echo $str | sed "s@$oldstr@$newstr@g")
приведенный выше код заменит все вхождения указанного термина замены, если вы хотите, удалите окончаниеg
что означает, что будет заменено только первое вхождение.
У меня было аналогичное требование, но моя замена var содержала амперсанд. Избежание амперсанда, как это, решило мою проблему:
replace="salt & pepper"
echo "pass the salt" | sed "s/salt/${replace/&/\&}/g"
Не относится к вопросу, но в случае, если кто-то передает строку в качестве аргумента сценарию bash, это может помочь.
Использование:
./bash_script.sh "path\to\file"
Вместо:
./bash_script.sh path\to\file
Для справки.
Я предпочитаю использовать двойные кавычки, так как одинарные кавычки очень мощные, так как мы использовали их, если не можем ничего изменить внутри них или можем вызвать замену переменных.
поэтому используйте двойные кавычки.
echo $LINE | sed -e "s/12345678/$replace/g"
Используйте это вместо
echo $LINE | sed -e 's/12345678/$replace/g'
это работает для меня просто удалить цитаты