Замените строку в скрипте оболочки с помощью переменной


Я использую ниже код для замены строки внутри сценария оболочки.

echo $LINE | sed -e 's/12345678/"$replace"/g'

но его заменяют на $replace вместо значения этой переменной.

кто-нибудь может сказать, что пошло не так?

8 67

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

использовать это вместо

echo $LINE | sed -e 's/12345678/$replace/g'

это работает для меня, просто убрать кавычки

Я предпочитаю использовать двойные кавычки, так как одиночные quptes очень сильны, поскольку мы использовали их, если не в состоянии изменить что-либо внутри него или может вызвать переменную substituion .

поэтому используйте двойные кавычки instaed.

echo $LINE | sed -e "s/12345678/$replace/g"