【问题标题】:excluding xml tag in sed - specific case排除 sed 中的 xml 标记 - 具体情况
【发布时间】:2012-11-15 13:13:22
【问题描述】:

请帮忙! 我花了几个小时寻找我的解决方案,我正在用头撞墙...... 我想要使​​用 sed 做的只是: 查找包含“Number Deleted”字符串的标签,并将其删除

输入:

    <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
}

【问题讨论】:

  • 您应该使用 XML 工具进行此类操作。在任何复杂的嵌套中使用 sed 或 grep 都会失败。
  • 肯定的是,sed 不适合,但杀了我 :) 它必须是 sed

标签: xml bash sed multiline


【解决方案1】:

使用可识别 XML 的工具。例如xsh:

open file.xml ;
remove //Row[Cell/Data/text()='Number Deleted'] ;
save :b ;

【讨论】:

    【解决方案2】:

    我不认为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>
    

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed '/<Row /!b;:a;$bb;N;/.*\n[^\n]*<\/Row>/!ba;:b;/Number Deleted/d' file
      

      【讨论】:

        猜你喜欢
        • 2015-08-18
        • 1970-01-01
        • 2015-04-12
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-25
        • 2012-08-08
        相关资源
        最近更新 更多