Заменить строку в сценарии оболочки, используя переменную - PullRequest
72 голосов
/ 22 июля 2010

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

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

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

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

Ответы [ 9 ]

113 голосов
/ 22 июля 2010

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

62 голосов
/ 22 июля 2010

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

$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
12 голосов
/ 28 июня 2016

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

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
6 голосов
/ 20 июля 2011

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

echo $LINE | sed -e "s/12345678/$replace/g"
3 голосов
/ 22 июля 2010
echo $LINE | sed -e 's/12345678/'$replace'/g'

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

2 голосов
/ 26 декабря 2018

Нашли Изящное решение .

echo ${LINE//12345678/$replace}
1 голос
/ 08 мая 2015

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

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
0 голосов
/ 26 сентября 2017

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

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

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

0 голосов
/ 03 января 2014

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

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

echo $LINE | sed -e "s/12345678/$replace/g"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...