使用sed从XML节点中删除内容

时间:2018-05-21 10:37:06

标签: regex xml linux sed xml-parsing

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

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

  </logos>
...

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

<logos></logos>

我的命令如下:

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

但是它还没有用。我错过了什么?

修改:这不是delete node in a xml file with sed的重复:该问题是关于删除整个节点。在这里,我需要删除仅节点的内容

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

对于此类案件,

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>