2016-11-26 73 views
-1

我想从我的扁平化的XML文件中删除一个节点,我的XML文件包含以下内容的XML文件:删除节点与sed的

... 
<cellule ref="1111"/> 
</blah> 
<workdocument id="bar" classement="1"/> 
<tablau id="35"> 
<cellule ref="1250"/> 
<area id="foo"> 
<subarea>Ipsum Lorem Dolor</subarea> 
<area> 
... 

我需要删除<workdocument id="bar" classement="1"/>,所以从元素<workdocument直到正在关闭 “/>

我试着用SED如下:

echo '<cellule ref="1111"/></blah><workdocument id="bar" classement="1"/><tablau id="35"><cellule ref="1250"/><area id="foo"><subarea>Ipsum Lorem Dolor</subarea><area>' |sed 's/<workdocument.*\/>//' 
<cellule ref="1111"/></blah><area id="foo"><subarea>Ipsum Lorem Dolor</subarea><area> 

<cellule ref="1250"/><area id="foo">也将被删除:/

请注意,属性classement的价值是不知道:/

谢谢

+3

使用sed或类似工具处理XML(或其他结构化数据)通常不是一个好主意。你的输入仍然是有效的XML吗?您可能希望查看XML处理工具,如xmlstarlet。在这种情况下:'xmlstarlet ed -d // workdocument file.xml' – Wintermute

+0

嗨,谢谢,是的,它仍然有效,为什么我试图使用sed反而是因为我将在bash脚本中使用它,而我不确定xmlstarlet是否安装在所有机器上。 – Zatla00

+2

捆绑它,这是我的建议。或者依赖于像python这样的东西,它无处不在,并且在其标准库中有XML处理。使用sed处理XML的问题是,突然输入是有效的XML是不够的,它必须是XML,它的格式可以通过脚本可以处理的方式进行。例如,如果我在' Wintermute

回答

2

试试这个:sed 's/<workdocument[^\/]*\/>//'

这使用[^/]*而不是.*workdocument后,使其匹配不超过第一个/>[^/]/以外的其他字符匹配。

+0

它很好地工作谢谢你,请你给一些使用的语法的解释? – Zatla00

+0

新增说明。是否有意义?我不是在英语写作很不错... – kaitoy

+0

谢谢你,现在是为我好! – Zatla00