2010-07-22 3 views
61

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

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

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

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

+0

Для общего связанного вопроса об обработке значений с помощью слэшей в них см. Http://stackoverflow.com/questions/5864146/use-slashes-in-sed-replace – tripleee

ответ

87

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

+0

. Я не хочу, чтобы котировки помещали in.i, чтобы один номер был заменен другим – Vijay

+2

'export' не требуется. –

+1

paxdiablo: 'set' также не требуется (и как вы собираетесь его использовать?). Просто 'replace = 987654321'. –

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

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

+0

У этой проблемы возникает проблема, заключающаяся в том, что использование '$ replace' вне каких-либо кавычек приведет к тому, что оболочка будет выполнять индексирование пробелов и расширение подстановки для значения. Это, похоже, будет работать с простыми значениями, но может резко взорваться на нетривиальных строках. Не используйте это в производственном коде. – tripleee

52

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

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

Может захотеть упомянуть, что это bash-specific (и ksh?). Вероятно, не для импорта для большинства людей, но некоторые из нас по-прежнему вынуждены работать над древними UNIXen :-) – paxdiablo

+4

Остерегайтесь, это также терпит неудачу в тире, что является '/ bin/sh' для многих современных Linux. – phihag

5

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

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

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

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

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

Разве это не отличается от ответа Дейва [http://stackoverflow.com/a/6756853/2235132)? – devnull

1

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

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 
7

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

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 
0

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

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

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

Смежные вопросы