【问题标题】:Shell: How to replace something of a text with the saved variable valueShell:如何用保存的变量值替换文本的某些内容
【发布时间】:2011-04-04 14:46:10
【问题描述】:

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

timeoutvalue=`echo "timeout=2.0"`

我必须从另一个文本中 grep 超时值,并用这个超时值替换它。 比如文字是egtest:

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

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

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

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/>

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: regex shell sed awk grep


    【解决方案1】:

    我会把你的代码写成如下。

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

    【讨论】:

    • z1x2,非常感谢您的精彩回答。事实上,这正是我想要的。
    【解决方案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 替换为它的值。

    【讨论】:

    • codaddict,非常感谢您的回答。看来我还没有完全承认单引号和双引号之间的区别。谢谢。
    【解决方案3】:

    单引号禁止变量扩展。

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

    【讨论】:

    • lgnacio,感谢您的方法和快速回答。但是你能告诉我除了 $timeoutvalue 的双引号之外,我们如何使用另一个单引号吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多