ksh 스크립트를 사용하여 XML 문서의 내용을 기반으로 여러 노드를 추출하고 싶습니다.

ksh 스크립트를 사용하여 XML 문서의 내용을 기반으로 여러 노드를 추출하고 싶습니다.

전제 조건: ksh 스크립트 명령을 사용하여 수행되어야 합니다.

다음 문서가 있고 하위 항목에 또는 이 포함된 <Sw:RMARecrd>모든 을 추출해야 합니다 .<Doc:Crspdt>BSDTUS30MITMUS30

<?xml version="1.0" encoding="UTF-8" ?>
<Sw:RMAFile xmlns:Sw="urn:swift:snl:ns.Sw" xmlns:Doc="urn:swift:snl:ns.Doc" xmlns:SwSec="urn:swift:snl:ns.SwSec">

<Sw:RMAFileHdr>
<Sw:Bic8Lst>
<Doc:Bic8>BSDTGB20</Doc:Bic8>
<Doc:Bic8>BSDTUS30</Doc:Bic8>
Doc:Bic8>BWTRUS30</Doc:Bic8>
<Doc:Bic8>MELNJPJ0</Doc:Bic8>
<Doc:Bic8>NEIMGB20</Doc:Bic8>
<Doc:Bic8>ZYHJGB20</Doc:Bic8>
<Doc:Bic8>ZYIYUS30</Doc:Bic8>
<Doc:Bic8>ZYJDGB20</Doc:Bic8>
</Sw:Bic8Lst>

<Sw:SvcLst>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
</Sw:SvcLst>

<Sw:FileMaintncSts>Partial</Sw:FileMaintncSts>
<Sw:FileDesc/><Sw:CrDtTm>2016-08-01T10:17:02Z</Sw:CrDtTm>
<Sw:TltRecrd>254</Sw:TltRecrd>
<Sw:LAU><Sw:LAUVal>RRgL2lsocXDswCHxgnf4ww==</Sw:LAUVal></Sw:LAU>

</Sw:RMAFileHdr>

<Sw:RMARecrd>
<Sw:Tp>Received</Sw:Tp>
<Sw:RMASts>Rejected</Sw:RMASts>
<Doc:Issr>ZYLCUS30</Doc:Issr>
<Doc:Crspdt>BSDTGB20</Doc:Crspdt>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
<Doc:IssdDtTm>2014-09-12T13:16:19Z</Doc:IssdDtTm>
</Sw:RMARecrd>

<Sw:RMARecrd>
<Sw:Tp>Received</Sw:Tp>
<Sw:RMASts>Enabled</Sw:RMASts>
<Doc:Issr>AGIGUS30</Doc:Issr>
<Doc:Crspdt>BSDTUS30</Doc:Crspdt>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
<Doc:IssdDtTm>2013-06-26T13:20:20Z</Doc:IssdDtTm>
</Sw:RMARecrd>

<Sw:RMARecrd>
<Sw:Tp>Received</Sw:Tp>
<Sw:RMASts>Enabled</Sw:RMASts>
<Doc:Issr>AQRMUS30</Doc:Issr>
<Doc:Crspdt>BSDTUS30</Doc:Crspdt>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
<Doc:IssdDtTm>2014-11-05T02:17:34Z</Doc:IssdDtTm>
</Sw:RMARecrd>

<Sw:RMARecrd>
<Sw:Tp>Received</Sw:Tp>
<Sw:RMASts>Enabled</Sw:RMASts>
<Doc:Issr>BLBGGB20</Doc:Issr>
<Doc:Crspdt>BSDTUS30</Doc:Crspdt>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
<Doc:IssdDtTm>2015-11-20T10:30:18Z</Doc:IssdDtTm>
<SwSec:Signature>
<SwSec:SignedInfo><Sw:Reference><Sw:DigestValue>s6ytg+2eV+e4Pg0UzUwD+lW0hAudR3N/VeSwleg3bzU=</Sw:DigestValue></Sw:Reference></SwSec:SignedInfo>
<SwSec:SignatureValue>
PEMF@Proc-Type: 4,MIC-ONLY
Content-Domain: RFC822
EntrustFile-Version: 2.0
Originator-DN: cn=blbggb2l-2,ou=prod,o=blbggb2l,o=swift
Orig-SN: 1416707530
MIC-Info: SHA256, RSA,
 TwfVoV22y+iqiNwiZ5p40kGk7a9Gm8bHcdPH1bzF19063Q8BsglE59dF8Fsscnk8
 M1SuDzwAVZFI4Na1iqf/cAbuugVbXKThBUAtNrqypVehrsl4BOXkU3LK0XGVtrDj
 oVHsBs0k8zhk/6cOBUIWr2O+WQA9opvgMEYdaNqVW2OC+UCBsDV8gDyZFvi/cnVR
 mEn4OOEKfNrQMvPR+ackPWFdb5FE70N/L2IZjrYGPcVbkR/UBg6zCOojuEOqbSdO
 EEzT5DVd8d3AHb2NeqXoYNnRmkxK9qqIijCw5VHTPCBANmKuJVlciMW0Vv+rrbsU
 MIIP/MkoPPW17r0Ts9acoQ==
</SwSec:SignatureValue>
<SwSec:KeyInfo>
<SwSec:SignDN>cn=blbggb2l-2,ou=prod,o=blbggb2l,o=swift</SwSec:SignDN>
<SwSec:CertPolicyId>1.3.21.6.2</SwSec:CertPolicyId>
</SwSec:KeyInfo>
<SwSec:Manifest>
<Sw:Reference><Sw:DigestRef>Authorisation</Sw:DigestRef><Sw:DigestValue>aLxFLajsQFYloHlaU2GZPfudNO9sdeqGPb3G8GBkweA=</Sw:DigestValue></Sw:Reference>
<Sw:Reference><Sw:DigestRef>Sw.E2S</Sw:DigestRef><Sw:DigestValue>7XFoTufTG0l2fMNoC+mzpAmTKgeipVlcTK0Q3KlW8fw=</Sw:DigestValue></Sw:Reference>
<Sw:Reference><Sw:DigestRef>Sw.NRS</Sw:DigestRef><Sw:DigestValue>qRuWmiLLsuT2lamWkG8Zo7qRrxqolRCWNLPs//OsvCE=</Sw:DigestValue></Sw:Reference>
</SwSec:Manifest>
</SwSec:Signature>
</Sw:RMARecrd>

<Sw:RMARecrd>
<Sw:Tp>Received</Sw:Tp>
<Sw:RMASts>Enabled</Sw:RMASts>
<Doc:Issr>BLBGGB50</Doc:Issr>
<Doc:Crspdt>BSDTUS30</Doc:Crspdt>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
<Doc:IssdDtTm>2014-11-17T17:30:27Z</Doc:IssdDtTm>
</Sw:RMARecrd>

<Sw:RMARecrd>
<Sw:Tp>Received</Sw:Tp>
<Sw:RMASts>Enabled</Sw:RMASts>
<Doc:Issr>BRIPUS40</Doc:Issr>
<Doc:Crspdt>BSDTUS30</Doc:Crspdt>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
<Doc:IssdDtTm>2014-07-22T06:28:12Z</Doc:IssdDtTm>
</Sw:RMARecrd>

<Sw:RMARecrd>
<Sw:Tp>Received</Sw:Tp>
<Sw:RMASts>Enabled</Sw:RMASts>
<Doc:Issr>CFSMAU20</Doc:Issr>
<Doc:Crspdt>BSDTUS30</Doc:Crspdt>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
<Doc:IssdDtTm>2015-02-26T23:24:52Z</Doc:IssdDtTm>
</Sw:RMARecrd>

<Sw:RMARecrd>
<Sw:Tp>Received</Sw:Tp>
<Sw:RMASts>Enabled</Sw:RMASts>
<Doc:Issr>CITIBGS0</Doc:Issr>
<Doc:Crspdt>BSDTUS30</Doc:Crspdt>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
<Doc:IssdDtTm>2014-04-08T07:34:10Z</Doc:IssdDtTm>
</Sw:RMARecrd>

<Sw:RMARecrd>
<Sw:Tp>Received</Sw:Tp>
<Sw:RMASts>Enabled</Sw:RMASts>
<Doc:Issr>CITICZP0</Doc:Issr>
<Doc:Crspdt>BSDTUS30</Doc:Crspdt>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
<Doc:IssdDtTm>2014-01-20T07:52:11Z</Doc:IssdDtTm>
</Sw:RMARecrd>

</Sw:RMAFile>

위의 파일이 주어지면 달성하려는 출력은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8" ?>
<Sw:RMAFile xmlns:Sw="urn:swift:snl:ns.Sw" xmlns:Doc="urn:swift:snl:ns.Doc" xmlns:SwSec="urn:swift:snl:ns.SwSec">

<Sw:RMAFileHdr>
<Sw:Bic8Lst>
<Doc:Bic8>BSDTGB20</Doc:Bic8>
</Sw:Bic8Lst>

<Sw:SvcLst>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
</Sw:SvcLst>

<Sw:FileMaintncSts>Partial</Sw:FileMaintncSts>
<Sw:FileDesc/><Sw:CrDtTm>2016-08-01T10:17:02Z</Sw:CrDtTm>
<Sw:TltRecrd>254</Sw:TltRecrd>
<Sw:LAU><Sw:LAUVal>RRgL2lsocXDswCHxgnf4ww==</Sw:LAUVal></Sw:LAU>

</Sw:RMAFileHdr>

<Sw:RMARecrd>
<Sw:Tp>Received</Sw:Tp>
<Sw:RMASts>Rejected</Sw:RMASts>
<Doc:Issr>ZYLCUS30</Doc:Issr>
<Doc:Crspdt>BSDTGB20</Doc:Crspdt>
<Doc:SvcNm>swift.fin!p</Doc:SvcNm>
<Doc:IssdDtTm>2014-09-12T13:16:19Z</Doc:IssdDtTm>
</Sw:RMARecrd>

</Sw:RMAFile>

답변1

(누락된 부분이 <XML 시작 부분 근처에서 수정되었다고 가정합니다...)

당신은 실제로 원하지 않습니다정제(선택) 원하는 데이터삭제보고 싶지 않은 데이터.

사용XML 스타:

$ xml ed -t -d '//Sw:RMARecrd[Doc:Crspdt != "BSDTGB20" and Doc:Crspdt != "MITMUS30"]' -nl data.xml

이 반환

<?xml version="1.0" encoding="UTF-8"?>
<Sw:RMAFile xmlns:Sw="urn:swift:snl:ns.Sw" xmlns:Doc="urn:swift:snl:ns.Doc" xmlns:SwSec="urn:swift:snl:ns.SwSec">
  <Sw:RMAFileHdr>
    <Sw:Bic8Lst>
      <Doc:Bic8>BSDTGB20</Doc:Bic8>
      <Doc:Bic8>BSDTUS30</Doc:Bic8>
      <Doc:Bic8>BWTRUS30</Doc:Bic8>
      <Doc:Bic8>MELNJPJ0</Doc:Bic8>
      <Doc:Bic8>NEIMGB20</Doc:Bic8>
      <Doc:Bic8>ZYHJGB20</Doc:Bic8>
      <Doc:Bic8>ZYIYUS30</Doc:Bic8>
      <Doc:Bic8>ZYJDGB20</Doc:Bic8>
    </Sw:Bic8Lst>
    <Sw:SvcLst>
      <Doc:SvcNm>swift.fin!p</Doc:SvcNm>
    </Sw:SvcLst>
    <Sw:FileMaintncSts>Partial</Sw:FileMaintncSts>
    <Sw:FileDesc/>
    <Sw:CrDtTm>2016-08-01T10:17:02Z</Sw:CrDtTm>
    <Sw:TltRecrd>254</Sw:TltRecrd>
    <Sw:LAU>
      <Sw:LAUVal>RRgL2lsocXDswCHxgnf4ww==</Sw:LAUVal>
    </Sw:LAU>
  </Sw:RMAFileHdr>
  <Sw:RMARecrd>
    <Sw:Tp>Received</Sw:Tp>
    <Sw:RMASts>Rejected</Sw:RMASts>
    <Doc:Issr>ZYLCUS30</Doc:Issr>
    <Doc:Crspdt>BSDTGB20</Doc:Crspdt>
    <Doc:SvcNm>swift.fin!p</Doc:SvcNm>
    <Doc:IssdDtTm>2014-09-12T13:16:19Z</Doc:IssdDtTm>
  </Sw:RMARecrd>
</Sw:RMAFile>

해당 항목도 삭제하려면 다음을 수행하십시오 <Doc:Bic8>.

$ xml ed -t \
    -d '//Sw:RMARecrd[Doc:Crspdt != "BSDTGB20" and Doc:Crspdt != "MITMUS30"]' \
    -d '//Doc:Bic8[. != "BSDTGB20" and . != "MITMUS30"]' -nl data.xml

이는 반환

<?xml version="1.0" encoding="UTF-8"?>
<Sw:RMAFile xmlns:Sw="urn:swift:snl:ns.Sw" xmlns:Doc="urn:swift:snl:ns.Doc" xmlns:SwSec="urn:swift:snl:ns.SwSec">
  <Sw:RMAFileHdr>
    <Sw:Bic8Lst>
      <Doc:Bic8>BSDTGB20</Doc:Bic8>
    </Sw:Bic8Lst>
    <Sw:SvcLst>
      <Doc:SvcNm>swift.fin!p</Doc:SvcNm>
    </Sw:SvcLst>
    <Sw:FileMaintncSts>Partial</Sw:FileMaintncSts>
    <Sw:FileDesc/>
    <Sw:CrDtTm>2016-08-01T10:17:02Z</Sw:CrDtTm>
    <Sw:TltRecrd>254</Sw:TltRecrd>
    <Sw:LAU>
      <Sw:LAUVal>RRgL2lsocXDswCHxgnf4ww==</Sw:LAUVal>
    </Sw:LAU>
  </Sw:RMAFileHdr>
  <Sw:RMARecrd>
    <Sw:Tp>Received</Sw:Tp>
    <Sw:RMASts>Rejected</Sw:RMASts>
    <Doc:Issr>ZYLCUS30</Doc:Issr>
    <Doc:Crspdt>BSDTGB20</Doc:Crspdt>
    <Doc:SvcNm>swift.fin!p</Doc:SvcNm>
    <Doc:IssdDtTm>2014-09-12T13:16:19Z</Doc:IssdDtTm>
  </Sw:RMARecrd>
</Sw:RMAFile>

일치를 더욱 제한하고 를 사용하지 않고 노드에 대한 경로를 지정할 수 있습니다 //.

관련 정보