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

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

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

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

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

13 ответов

Решение

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

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

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

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

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

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

echo ${LINE//12345678/$replace}

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

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

Приведу два примера.

  • Используя sed:
      #!/bin/bash
LINE="12345678HI"
replace="Hello"
echo $LINE | sed -e "s/12345678/$replace/g"
  • Без использования sed:
      LINE="12345678HI"
str_to_replace="12345678"
replace_str="Hello"
result=${str//$str_to_replace/$replace_str}
echo $result

Надеюсь, вы найдете это полезным!

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

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

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

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

используйте @, если вы хотите заменить такие вещи, как /. $ и т. д.

      result=$(echo $str | sed "s@$oldstr@$newstr@g")

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

У меня было аналогичное требование, но моя замена var содержала амперсанд. Избежание амперсанда, как это, решило мою проблему:

replace="salt & pepper"
echo "pass the salt" | sed "s/salt/${replace/&/\&}/g"

Не относится к вопросу, но в случае, если кто-то передает строку в качестве аргумента сценарию bash, это может помочь.

Использование:

./bash_script.sh "path\to\file"

Вместо:

./bash_script.sh path\to\file

Для справки.

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

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

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

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

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

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

Другие вопросы по тегам