【问题标题】:Remove content from XML node with sed使用 sed 从 XML 节点中删除内容
【发布时间】:2018-10-31 00:03:25
【问题描述】:

我的 XML 输入文件如下所示:

...
  <logos>
    <logo name="" primary="true" guid="c6aae8fe-bb04-4067-9b14-18b1bcf940d3" />
    <logo name="" primary="false" guid="68b55f4d-f401-4180-b0e0-160974758348" />

  </logos>
...

我需要删除内容,保留节点。预期输出:

&lt;logos&gt;&lt;/logos&gt;

我的命令如下所示:

sed -i 's|\(<logos>\)\(.+\)\(</logos>\)|\1\3|gi' $filename

但它不起作用。我错过了什么?

编辑:这不是delete node in a xml file with sed 的重复:这个问题是关于删除整个节点。这里我只需要删除节点的内容

【问题讨论】:

标签: regex xml linux sed xml-parsing


【解决方案1】:

除了c 命令之外,您还可以使用地址范围:

sed -i.bak '/<logos>/,/<\/logos>/c<logos></logos>' $filename

【讨论】:

    【解决方案2】:

    sed 等对于这种情况将是一个糟糕的选择。
    使用适当的 XML/HTML 解析器。

    xmlstarlet解决办法:

    示例input.xml:

    <root>
    <logos>
        <logo name="" primary="true" guid="c6aae8fe-bb04-4067-9b14-18b1bcf940d3"/>
        <logo name="" primary="false" guid="68b55f4d-f401-4180-b0e0-160974758348"/>
      </logos>
    </root>
    

    xmlstarlet ed -O -d '//logos/*' input.xml
    

    输出:

    <root>
      <logos/>
    </root>
    

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 2017-04-10
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2018-06-13
      相关资源
      最近更新 更多