【问题标题】:Substitute IP using sed or awk from xml which contains square brakets使用 sed 或 awk 从包含方括号的 xml 替换 IP
【发布时间】:2018-10-10 07:28:47
【问题描述】:

我有这段代码想从以下位置更改 IP:

<mailHost>[10.237.30.150]:25</mailHost>

我需要更改为另一个 IP: 预期结果:

<mailHost>[10.237.30.151]:25</mailHost>

这是我尝试过的,但仍然报错,并没有改变任何东西。

sed -n "/<mailHost>/ {s/10.237.30.150/10.237.30.151/}" file

非常欢迎任何提示:) 谢谢。

【问题讨论】:

  • 不要使用非语法感知工具解析 XML - 使用 xmlstartletxmllint

标签: xml bash awk replace square-bracket


【解决方案1】:

您的问题不清楚(您是要在发生的任何地方替换任何 IP,还是仅替换特定 IP 或仅在该上下文中替换该特定 IP,或在该上下文中替换任何 IP 或其他内容?)但这可能 做你想要的:

$ sed 's/\(<mailHost>\[\)[^]]*/\110.237.30.151/' file
<mailHost>[10.237.30.151]:25</mailHost>

【讨论】:

    【解决方案2】:

    关注awk 可能对您有所帮助。

    awk -v value="new_value" '/mailHost/{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/);val=substr($0,RSTART,RLENGTH);if(val){print substr($0,1,RSTART-1) value substr($0,RSTART+RLENGTH);next}} 1'  Input_file
    

    如果您想在 Input_file 本身中进行更改,请在上述命令&gt; temp_file &amp;&amp; mv temp_file Input_file 中添加以下内容。

    现在也添加非单行形式的解释。

    awk -v value="new_value" '
    /mailHost/{
        match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/);
        val=substr($0,RSTART,RLENGTH);
        if(val){
           print substr($0,1,RSTART-1) value substr($0,RSTART+RLENGTH);
           next}
    }
    1'   Input_file
    

    【讨论】:

    • 非常感谢 :) 使用 awk 是一个非常好的选择 :)
    【解决方案3】:
    sed -i "s/10.237.30.150/10.237.30.151/g" file
    

    这不行吗?

    【讨论】:

    • 太狂野了。由于其他一些也具有此 IP 的条目会受到影响。顺便说一句,谢谢。
    猜你喜欢
    • 2020-01-17
    • 2020-06-12
    • 2014-02-05
    • 2016-11-25
    • 2018-09-20
    • 2023-01-24
    • 2014-03-24
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多