xml 태그에서 문자열을 찾고 일치 태그의 일부인 줄을 삭제합니다.

xml 태그에서 문자열을 찾고 일치 태그의 일부인 줄을 삭제합니다.

문자열을 검색 <oneFi institution="12345678">하고 삭제해야 함<value maxPAN="19" minPAN="4" prefix="528749"/>

실제:

      <oneFi institution="12345678">
        <bin _list="1">
          <value maxPAN="19" minPAN="4" prefix="528749"/>
          <value maxPAN="19" minPAN="4" prefix="544448"/>
          <value maxPAN="19" minPAN="4" prefix="557231"/>
        </bin>
      </oneFi>
      <oneFi institution="854784662">
        <bin _list="1">
          <value maxPAN="19" minPAN="4" prefix="528749"/>
          <value maxPAN="19" minPAN="4" prefix="544448"/>
        </bin>
      </oneFi>

예상되는:

      <oneFi institution="12345678">
        <bin _list="1">
          <value maxPAN="19" minPAN="4" prefix="544448"/>
          <value maxPAN="19" minPAN="4" prefix="557231"/>
        </bin>
      </oneFi>
      <oneFi institution="854784662">
        <bin _list="1">
          <value maxPAN="19" minPAN="4" prefix="528749"/>
          <value maxPAN="19" minPAN="4" prefix="544448"/>
        </bin>
      </oneFi>

답변1

예를 들어 XML 문서가 유효하다고 가정하면

<?xml version="1.0"?>
<root>
  <oneFi institution="12345678">
    <bin _list="1">
      <value maxPAN="19" minPAN="4" prefix="528749"/>
      <value maxPAN="19" minPAN="4" prefix="544448"/>
      <value maxPAN="19" minPAN="4" prefix="557231"/>
    </bin>
  </oneFi>
  <oneFi institution="854784662">
    <bin _list="1">
      <value maxPAN="19" minPAN="4" prefix="528749"/>
      <value maxPAN="19" minPAN="4" prefix="544448"/>
    </bin>
  </oneFi>
</root>

(귀하의 예에는 루트 노드가 없습니다)

그런 다음 XMLstarlet을 사용할 수 있습니다.

$ xmlstarlet ed -d '//oneFi[@institution="12345678"]//value[@prefix="528749"]' file.xml
<?xml version="1.0"?>
<root>
  <oneFi institution="12345678">
    <bin _list="1">
      <value maxPAN="19" minPAN="4" prefix="544448"/>
      <value maxPAN="19" minPAN="4" prefix="557231"/>
    </bin>
  </oneFi>
  <oneFi institution="854784662">
    <bin _list="1">
      <value maxPAN="19" minPAN="4" prefix="528749"/>
      <value maxPAN="19" minPAN="4" prefix="544448"/>
    </bin>
  </oneFi>
</root>

XPATH 표현식은 노드의 속성과 선택한 노드 아래 어딘가에 있는 노드의 속성을 사용하여 //oneFi[@institution="12345678"]//value[@prefix="528749"]질문에서 언급한 노드와 일치 합니다.institutiononeFiprefixvalueoneFi

노드 속성 값을 더 구체적으로 지정해야 하는 경우 value다음을 사용하여 다른 속성을 일치시킬 수도 있습니다.

value[@prefix="528749" and @maxPAN="19" and @minPAN="4"]

그 표현 부분에서요.

ed -dXMLstarlet 명령의 (또는 ) 비트는 ed --delete유틸리티가 다음을 수행해야 함을 의미합니다.편집하다XML 문서와삭제표현식과 일치하는 노드입니다.

답변2

일반적으로 , 또는 와 같은 도구를 사용하여 XML을 조작하는 것은 불가능합니다 sed. 일반 XML의 경우 XML 구문 분석 라이브러리를 사용하세요.awkgrep

XML 파일이 항상 같은 방식으로 형식화되는 경우(예: 한 줄에 하나의 태그, 예제와 동일한 태그와 중첩)를 사용할 수 있습니다 awk.

awk  'BEGIN { institutionMatch=0; skipValue=0; }
/<oneFi institution="[^"]*">/ { institutionMatch=0; }      # assume other institution
/<oneFi institution="12345678">/ { institutionMatch=1; }   # relevant institution
/<value maxPAN="19" minPAN="4" prefix="528749"\/>/ { if(institutionMatch)
    skipValue=1;   # mark to skip if found in matching institution
}
{ if(!skipValue) { print; } skipValue=0; }' inputfile > outputfile

참고: XML 파일이 예제와 다르게 보일 경우 이 스크립트는 가비지를 생성할 수 있습니다.

관련 정보