Замените строку в оболочке script, используя переменную

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

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

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

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

Ответ 1

Если вы хотите интерпретировать $replace, вы не должны использовать одинарные кавычки, поскольку они предотвращают замену переменных.

Try:

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 (например, / например), так как это вызовет путаницу, если не будет экранировано. Но если, как вы говорите, вы заменяете одно число на другое, это не должно быть проблемой.

Ответ 2

вы можете использовать оболочку (bash/ksh).

$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc

Ответ 3

Не относится к конкретному вопросу, но для людей, которым нужна такая же функциональность, расширенная для ясности из предыдущих ответов:

# create some variables
str="someFileName.foo"
find=".foo"
replace=".bar"
# notice the the str isn't prefixed with $
#    this is just how this feature works :/
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

Ответ 4

Одиночные кавычки очень сильны. Внутри вы ничего не можете сделать, чтобы вызывать замену переменных, пока вы не уйдете. Вместо этого используйте двойные кавычки:

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

Ответ 5

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

вы все равно можете использовать одинарные кавычки, но вам нужно "открыть" их, когда вы хотите, чтобы переменная расширялась в нужном месте. в противном случае строка берется "буквально" (как правильно сказал @paxdiablo, его ответ тоже правильный)

Ответ 7

Чтобы ваша оболочка расширила переменную, вам нужно использовать двойные кавычки, например

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

Ответ 8

Используйте это вместо

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

это работает для меня просто просто удаляет цитаты

Ответ 9

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

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

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