请帮忙! 我花了几个小时寻找我的重生,我正用脑袋撞墙! 我想用sed做的就是: 查找标记,其中包含“已删除数字”字符串,并将其删除
输入:
<Cell ss:StyleID="s128"/>
<Cell ss:StyleID="s128"/>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s81"><Data ss:Type="String">Number Deleted</Data></Cell>
<Cell ss:StyleID="s81"/>
<Cell ss:StyleID="s81"/>
<Cell ss:StyleID="s81"/>
<Cell ss:StyleID="s82"><Data ss:Type="Boolean">0</Data></Cell>
<Cell ss:StyleID="s81"/>
<Cell ss:StyleID="s82"><Data ss:Type="Boolean">0</Data></Cell>
<Cell ss:StyleID="s83"><Data ss:Type="String">-1</Data></Cell>
<Cell ss:StyleID="s81"><Data ss:Type="String">"Deleted:"</Data></Cell>
<Cell ss:StyleID="s81"/>
<Cell ss:StyleID="s81"/>
<Cell ss:StyleID="s81"/>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="String">Number Saved</Data></Cell>
<Cell ss:Index="5"><Data ss:Type="Boolean">0</Data></Cell>
<Cell ss:Index="7"><Data ss:Type="Boolean">0</Data></Cell>
输出:
<Cell ss:StyleID="s128"/>
<Cell ss:StyleID="s128"/>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="String">Number Saved</Data></Cell>
<Cell ss:Index="5"><Data ss:Type="Boolean">0</Data></Cell>
<Cell ss:Index="7"><Data ss:Type="Boolean">0</Data></Cell>
到目前为止我想通了,如何查看xml从“Number Deleted”中排除行直到标记结束,但这对xml完整性有误,因为标签未关闭,这就是我所拥有的:
function filter_xml
{
START="<Cell ss:StyleID="s81"><Data ss:Type="String">Number Deleted"
END="<\/Row>"
sed "/$START/,/$END/d" file.xml
}
答案 0 :(得分:1)
使用支持XML的工具。例如,xsh:
open file.xml ;
remove //Row[Cell/Data/text()='Number Deleted'] ;
save :b ;
答案 1 :(得分:1)
我认为sed
不是处理XML文件的最佳工具。
你真的不能解析XML文件吗?
以下是python
:
在/ tmp / data文件中:
<data xmlns:ss="foobar">
<Row>
<Cell ss:StyleID="s128"/>
<Cell ss:StyleID="s128"/>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s81"><Data ss:Type="String">Number Deleted</Data></Cell>
<Cell ss:StyleID="s83"><Data ss:Type="String">-1</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="String">Number Saved</Data></Cell>
<Cell ss:Index="5"><Data ss:Type="Boolean">0</Data></Cell>
</Row>
</data>
Python代码:
import xml.dom.minidom as Xml
file = "/tmp/data"
xmlDoc = Xml.parse(file)
for row in xmlDoc.getElementsByTagName("Row"):
if "Number Deleted" not in row.toprettyxml():
print row.toxml()
<强>输出:强>
<Row>
<Cell ss:StyleID="s128"/>
<Cell ss:StyleID="s128"/>
</Row>
<Row ss:AutoFitHeight="0">
<Cell><Data ss:Type="String">Number Saved</Data></Cell>
<Cell ss:Index="5"><Data ss:Type="Boolean">0</Data></Cell>
</Row>
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed '/<Row /!b;:a;$bb;N;/.*\n[^\n]*<\/Row>/!ba;:b;/Number Deleted/d' file