2011-10-06 145 views
34

试图改变一个文本文件中值SED替代与线bash脚本使用sed的,使用bash变量

sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp 

这将是一个for循环。不知道为什么它不起作用。有什么建议么?

回答

47

'中的变量不会在bash中被替换。要获得字符串替换(或内插,如果你熟悉perl的),你需要改变它用双引号",而不是单引号:

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp 

而且,除非你需要它在不同的文件您可以使用-i标志更改文件。

+4

也许还要提到,如果变量包含斜杠,则需要使用不会在字符串中出现的不同分隔符(或者在分隔符的每次出现时反斜杠)。斜杠是's'的常用默认值,但您可以使用任何标点符号; 'sed's%draw($ prev_number; n _)%draw($ number; n _)%g“file.txt”或“#from#to#g'或's_from_to_g'等 – tripleee

5
sed "s/draw($prev_number;n_)/draw($number;n_)/g" 

这项工作?

13

单引号内的变量未扩展,在双引号内,在这种情况下使用双引号。

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp 

你也可以使它与eval一起工作,但不这样做!

+0

谢谢你的工作。你介意解释一下你的意思吗?我的直觉告诉我,它应该是类似的,可变的替代。另外为什么不使用eval? – csta

1

您可以使用像下面这样的变量。像这里一样,我想替换hostname即文件中的系统变量。我找的字符串look.melook.me=<system_name>

sed -i "s/.*look.me.*/look.me=`hostname`/" 

更换是整条生产线也可以存储在其他变量系统值,可以使用变量替换。

host_var=`hostname`

sed -i "s/.*look.me.*/look.me=$host_var/"


输入文件:文件的

look.me=demonic 

输出(假设我的系统名称为prod-cfm-frontend-1-usa-central-1):

look.me=prod-cfm-frontend-1-usa-central-1