0

助けてください!私は自分の魂を探すのに何時間も費やしました、そして私は頭で壁にぶつかっています... 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">&quot;Deleted:&quot;</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除外行を表示する方法を理解しましたが、タグが閉じられていないため、これはxmlの整合性に問題があります。

function filter_xml
{
  START="<Cell ss:StyleID="s81"><Data ss:Type="String">Number Deleted"
  END="<\/Row>"
  sed "/$START/,/$END/d" file.xml
}
4

3 に答える 3

1

sedXML ファイルを扱うのに最適なツールだとは思いません。

実際に 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>
于 2012-11-15T13:29:12.057 に答える
1

XML 対応のツールを使用します。たとえば、xsh :

open file.xml ;
remove //Row[Cell/Data/text()='Number Deleted'] ;
save :b ;
于 2012-11-15T13:28:30.183 に答える
0

これはうまくいくかもしれません(GNU sed):

sed '/<Row /!b;:a;$bb;N;/.*\n[^\n]*<\/Row>/!ba;:b;/Number Deleted/d' file
于 2012-11-15T15:00:12.717 に答える