Замените строку в скрипте оболочки с помощью переменной
Я использую ниже код для замены строки внутри сценария оболочки.
echo $LINE | sed -e 's/12345678/"$replace"/g'
но его заменяют на $replace вместо значения этой переменной.
кто-нибудь может сказать, что пошло не так?
8 ответов:
если вы хотите интерпретировать
$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"
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/[#\]/\/g') sed -i "s#12345678#$replace_quoted#g" file.txt