Shell:如何用保存的变量值替换文本的某些内容

时间:2010-08-27 03:41:05

标签: regex shell sed awk grep

我通过shell命令保存了一个值: 例如:

timeoutvalue=`echo "timeout=2.0"`

我必须从另一个文本中获取超时值,并将其替换为此超时值。 例如,文本是egtest:

<host ip="255.255.255.0" name="testhost" description="hostfortest" connection="xmlrpc" timeout=4.0/>

我想从上面的文本中获取超时值,并将timeout=4.0的值替换为timeout=2.0(我通过shell命令保存为变量的值)。

我的问题是: (1)对于一个简单的测试,我想用$ timeoutvalue替换timeout = 4.0的值。 所以我的命令是:

sed 's/timeout=4.0/$timeoutvalue/g' egtext

但似乎文字变成了:

<host ip="255.255.255.0" name="testhost" description="hostfortest" connection="xmlrpc" $timeoutvalue/>

有人可以告诉我为什么这是错的吗?

(2)对于这个问题,我必须首先从文本中grep timeout=4.0,并将值4.0替换为保存的变量值(在我的示例中:2.0)。 我想但我不知道用哪个命令来实现这个(awk?sed?) 因为文本的字段不确定(例如,在本文中,超时在$5,但可能在另一个文本中,它可能会更改为$6)。我的意思是它可能会变成:

<host ip="255.255.255.0" name="testhost" description="hostfortest" connection="xmlrpc" type="onebox" timeout=4.0/>

有人可以帮我吗?

3 个答案:

答案 0 :(得分:2)

单引号不允许变量插值,因此请使用双引号:

sed "s/timeout=4.0/$timeoutvalue/g" egtext

编辑:

考虑

who='world'
echo "Hello $who" # prints Hello world
echo 'Hello $who" # prints Hello $who

如单引号所示,不允许变量替换。它将$who字面上视为一美元,然后是who。但双引号的行为有所不同,当它看到$who时,它意识到who是一个变量,并将$who替换为其值。

答案 1 :(得分:1)

单引号禁止变量扩展。

sed 's/timeout=4.0/'"$timeoutvalue"'/g' egtext

答案 2 :(得分:1)

我会将您的代码编写如下。

timeoutvalue='timeout=2.0'
sed "s/timeout=[.0-9]*/${timeoutvalue}/" egtext