it-roy-ru.com

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

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

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

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

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

70
Vijay

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

108
paxdiablo

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

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

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

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
11
bob

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

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

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

3
akira

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

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
1
Matthieu Moy

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

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

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

0
Tunde Pizzle

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

echo ${LINE//12345678/$replace}
0
Nicolae Iotu