一尘不染

Bash,删除空的XML标签

linux

我需要一些帮助,使用bash工具解决几个问题

  1. 我想从文件中删除空的xml标记,例如:
<CreateOfficeCode>
     <OperatorId>ve</OperatorId>
     <OfficeCode>1234</OfficeCode>
     <CountryCodeLength>0</CountryCodeLength>
     <AreaCodeLength>3</AreaCodeLength>
     <Attributes></Attributes>
     <ChargeArea></ChargeArea>
</CreateOfficeCode>

成为:

     <CreateOfficeCode>
          <OperatorId>ve</OperatorId>
          <OfficeCode>1234</OfficeCode>
          <CountryCodeLength>0</CountryCodeLength>
          <AreaCodeLength>3</AreaCodeLength>
     </CreateOfficeCode>

为此,我已经通过此命令这样做

    sed -i '/><\//d' file

并不是那么严格,它更像是一个把戏,更合适的方法是找到<pattern></pattern>并删除它。建议?

  1. 二,如何去:
     <CreateOfficeGroup>
           <CreateOfficeName>John</CreateOfficeName>
           <CreateOfficeCode>
           </CreateOfficeCode>
     </CreateOfficeGroup>

至:

     <CreateOfficeGroup>
           <CreateOfficeName>John</CreateOfficeName>
     </CreateOfficeGroup>
  1. 整体而言?从:
     <CreateOfficeGroup>
           <CreateOfficeName>John</CreateOfficeName>
           <CreateOfficeCode>
                <OperatorId>ve</OperatorId>
                <OfficeCode>1234</OfficeCode>
                <CountryCodeLength>0</CountryCodeLength>
                <AreaCodeLength>3</AreaCodeLength>
                <Attributes></Attributes>
                <ChargeArea></ChargeArea>
           </CreateOfficeCode>
           <CreateOfficeSize>
                <Chairs></Chairs>
                <Tables></Tables>
           </CreateOfficeSize>
     </CreateOfficeGroup>

至:

     <CreateOfficeGroup>
           <CreateOfficeName>John</CreateOfficeName>
           <CreateOfficeCode>
                <OperatorId>ve</OperatorId>
                <OfficeCode>1234</OfficeCode>
                <CountryCodeLength>0</CountryCodeLength>
                <AreaCodeLength>3</AreaCodeLength>
           </CreateOfficeCode>
     </CreateOfficeGroup>

您可以个人回答问题吗?非常感谢你!


阅读 257

收藏
2020-06-03

共1个答案

一尘不染

sed '#n
    1h;1!H
    $ { x
    :remtag
      s#\(\n* *\)*<\([^>]*>\)\( *\n*\)*</\2##g
      t remtag

      p
      }' YourFile

(posix版本--posix,例如GNU sed)

  • 递归地将空标签从下杆移到上杆,直到不再有空标签。
  • 不是XML解析器,因此类似<tag1 prop="<tag2></tag2>"> ...的内容也会删除prop内容以及xml允许的其他任何内容。
2020-06-03