Замените строку в оболочке 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, его ответ тоже правильный)
Ответ 6
Нашел изящное решение.
echo ${LINE//12345678/$replace}
Ответ 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"