Я использую приведенный ниже код для замены строки внутри сценария оболочки.
echo $LINE | sed -e 's/12345678/"$replace"/g'
но оно заменяется на $replace
вместо значения этой переменной.
Кто-нибудь может сказать, что пошло не так?
Я использую приведенный ниже код для замены строки внутри сценария оболочки.
echo $LINE | sed -e 's/12345678/"$replace"/g'
но оно заменяется на $replace
вместо значения этой переменной.
Кто-нибудь может сказать, что пошло не так?
Ответы:
Если вы хотите интерпретировать $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
( /
например, как), поскольку это вызовет путаницу, если не будет экранирован. Но если, как вы говорите, вы заменяете один номер другим, это не должно быть проблемой.
set
тоже не нужен (и как вы собирались его использовать?). Просто replace=987654321
.
export
чтобы гарантировать, что переменные установлены для детей, но, как вы говорите, вы можете легко избежать этого. Однако использование или отсутствие export
здесь не имеет значения (проблема стиля) и не влияет на фактический ответ, а именно, как использовать переменные в sed
команде.
-i
опцией. Знаете почему? или как заставить работать?
$
или `
в sed
скрипте был экранирован обратной косой чертой, чтобы защитить его от механизма замены оболочки для строк с двойными кавычками .
вы можете использовать оболочку (bash / ksh).
$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
/bin/sh
во многих современных Linux.
Не конкретно для вопроса, но для людей, которым нужна такая же функциональность, расширенная для ясности из предыдущих ответов:
# 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
Нашел изящное решение .
echo ${LINE//12345678/$replace}
echo $LINE | sed -e 's/12345678/'$replace'/g'
вы по-прежнему можете использовать одинарные кавычки, но вы должны «открывать» их, когда хотите, чтобы переменная развернулась в нужном месте. в противном случае строка воспринимается «буквально» (как правильно сказал @paxdiablo, его ответ также верен)
$replace
вне кавычек заставит оболочку выполнять токенизацию пробелов и подстановочные знаки для значения. Будет казаться, что это работает с простыми значениями, но может резко взорваться на нетривиальных строках. Не используйте это в производственном коде.
Чтобы ваша оболочка расширяла переменную, вам нужно использовать двойные кавычки, например
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
У меня было аналогичное требование, но моя замена var содержала амперсанд. Избежание амперсанда, как это, решило мою проблему:
replace="salt & pepper"
echo "pass the salt" | sed "s/salt/${replace/&/\&}/g"
Используйте это вместо
echo $LINE | sed -e 's/12345678/$replace/g'
это работает для меня, просто удалите кавычки
Я предпочитаю использовать двойные кавычки, поскольку одиночные кавычки очень эффективны, поскольку мы использовали их, если не можем ничего изменить в них или можем вызвать замену переменной.
поэтому используйте двойные кавычки.
echo $LINE | sed -e "s/12345678/$replace/g"