【问题标题】:sed replace xml tagsed 替换 xml 标签
【发布时间】:2017-06-20 15:38:02
【问题描述】:

我想使用 sed 替换 xml 文件中标签内的值。

<version> xxxx-SS </version>

我想用一些 shell 变量 $ver 替换 xxxx-SS。 最终结果应该是

<version>$ver</version>

替换第一个实例后,sed 命令也应该退出。

到目前为止,我只能追加到 xxxx-SS 并且无法在第一场比赛后退出。

sed 's#\(<version>\)*\(</version>\)#\1'$ver'\2#g' test.xml

这只会在-SNAPSHOT标签之间附加值。基本上使它成为xxxx-SS$ver

【问题讨论】:

  • 添加您试图质疑的代码...不建议对 xml 使用正则表达式,使用 xml 感知解析器
  • 请立即查看
  • 上面使用的正则表达式将不起作用:至少将* 更改为.*,但最好使用xmlstarlet查看下面的解决方案。

标签: shell unix sed


【解决方案1】:

使用 xml/html 解析器是处理 xml/html 文档的正确方法。不要在这种情况下使用 sed/awk 工具。

xmlstarlet解决方案:

xmlstarlet ed -u "//version[1]" -v $ver test.xml
  • ed - 编辑模式

  • -u - 更新操作

  • //version[1] - 选择第一个version标签的xpath表达式

  • -v $ver - 选定节点的新值

【讨论】:

    【解决方案2】:

    您可以尝试使用awk,它会更简单地实现您想要的,

    $ cp test.xml test_orig.xml
    
    $ awk '/<version> xxxx-SS <\/version>/{gsub(/<version> xxxx-SS <\/version>/,"<version> $ver </version>",$0)}1' test_orig.xml > test.xml
    $ cat test.xml
    ...
    <version> $ver </version>
    ...
    
    $ rm test_orig.xml
    

    该命令会将 xxxx-SS 替换为 test(将 var 值修改为您想要的值)

    【讨论】:

    • 它只是在标签之后添加,而不是在标签之间。它也没有写入同一个文件。
    • @KshitijGarg 请编辑问题以显示您的预期结果。
    • 请立即查看
    • 好吧,我误会你了,等一下。我会根据你的需要修改我的答案。
    • 老实说,我更喜欢 xmlstarlet 解决方案。
    猜你喜欢
    • 2017-12-12
    • 1970-01-01
    • 2015-10-07
    • 2019-05-25
    • 2016-03-13
    • 2017-10-07
    • 2011-11-03
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多