Замените строку в скрипте оболочки с помощью переменной
Я использую ниже код для замены строки внутри сценария оболочки.
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