【问题标题】:Script in Unix to Remove XML tags and contents from fileUnix 中的脚本以从文件中删除 XML 标记和内容
【发布时间】:2017-06-09 23:21:18
【问题描述】:

基本上需要从以 number.xml 命名的一组单独的 XML 文件中删除当事方实体(以及介于两者之间的所有内容)。我尝试了以下方法,但它并不能完全满足我的需求:

    cat test.xml | sed "s;<parties>;\do_opentag ;" | sed "s;</parties>;\do_closetag ;" |  awk 'BEGIN { doPrint = 1; } /do_opentag/ { doPrint = 0; print $0; } /do_closetag/ { doPrint = 1; } { if (doPrint) print $0; }' | grep -v 'do_opentag\|do_closetag'

<?xml version="1.0" encoding="UTF-8"?>
<patent-document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" pid="58326519" doc-generation-date="2016-10-11">
  <bibliographic-data>
    <application-reference>
      <pan>46422</pan>
    </application-reference>
    <publication-reference>
      <publication-office>KR</publication-office>
      <patent-publication-date>
        <year>2016</year>
        <month>10</month>
        <day>11</day>
      </patent-publication-date>
    </publication-reference>
    <parties>
      <applicants>
        <applicant sequence="1">
          <name lang="EN"></name>
          <address>
            <location-of-work>KR</location-of-work>M
          </address>
        </applicant>
      </applicants>
    </parties>
  </bibliographic-data>
  <vendor>Any</vendor>
  <document-translation-date>2016-11-24</document-translation-date>M
  <invention-title lang="EN">Cell preservation container for liquid-based cell inspection</invention-title>
  <abstract lang="EN">The present invention relates to a liquid for discharging liquid containing cells and cell may be a sampling which is simply eminent generated in </abstract>
  <comment lang="EN"></comment>
</patent-document>

【问题讨论】:

    标签: xml shell unix awk sed


    【解决方案1】:

    解析 XML 需要一个 XML 解析器。 使用起来相当简单。删除parties 节点:

    xmlstarlet ed -P -d '//parties' file.xml
    

    生产

    <?xml version="1.0" encoding="UTF-8"?>
    <patent-document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" pid="58326519" doc-generation-date="2016-10-11">
      <bibliographic-data>
        <application-reference>
          <pan>46422</pan>
        </application-reference>
        <publication-reference>
          <publication-office>KR</publication-office>
          <patent-publication-date>
            <year>2016</year>
            <month>10</month>
            <day>11</day>
          </patent-publication-date>
        </publication-reference>
    
      </bibliographic-data>
      <vendor>Any</vendor>
      <document-translation-date>2016-11-24</document-translation-date>M
      <invention-title lang="EN">Cell preservation container for liquid-based cell inspection</invention-title>
      <abstract lang="EN">The present invention relates to a liquid for discharging liquid containing cells and cell may be a sampling which is simply eminent generated in </abstract>
      <comment lang="EN"/>
    </patent-document>
    

    【讨论】:

      【解决方案2】:

      sed -e '/&lt;parties&gt;/,/&lt;\/parties&gt;/d' test.xml

      在 sed 中,您可以使用由逗号分隔的两个模式来将一个或多个 sed 命令应用于包括匹配模式在内的行范围以及匹配模式之间的行。这里我说的是d-- 删除这一行-- 从/&lt;parties&gt;//&lt;\/parties&gt;/

      这取决于您的 XML 格式。您需要保留的匹配行中没有其他内容。

      如果您想就地编辑文件,请在 sed 中添加 -i 标志。

      【讨论】:

      • 谢谢。差不多了。出于某种原因,我收到一条消息,提示“文件 test.xml 末尾缺少换行符”,并且关闭的 标记被删除。有什么办法解决吗?
      • 因为最后一行不包含终止换行符,sed 永远不会处理它。我从未见过这个问题,但the second answer here 似乎是合理的:echo &gt;&gt; test.xml; sed -e '/&lt;parties&gt;/,/&lt;\/parties&gt;/d' test.xml
      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 2017-08-11
      相关资源
      最近更新 更多