![xml 태그에서 문자열을 찾고 일치 태그의 일부인 줄을 삭제합니다.](https://linux55.com/image/147795/xml%20%ED%83%9C%EA%B7%B8%EC%97%90%EC%84%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%B0%BE%EA%B3%A0%20%EC%9D%BC%EC%B9%98%20%ED%83%9C%EA%B7%B8%EC%9D%98%20%EC%9D%BC%EB%B6%80%EC%9D%B8%20%EC%A4%84%EC%9D%84%20%EC%82%AD%EC%A0%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
문자열을 검색 <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"]
질문에서 언급한 노드와 일치 합니다.institution
oneFi
prefix
value
oneFi
노드 속성 값을 더 구체적으로 지정해야 하는 경우 value
다음을 사용하여 다른 속성을 일치시킬 수도 있습니다.
value[@prefix="528749" and @maxPAN="19" and @minPAN="4"]
그 표현 부분에서요.
ed -d
XMLstarlet 명령의 (또는 ) 비트는 ed --delete
유틸리티가 다음을 수행해야 함을 의미합니다.편집하다XML 문서와삭제표현식과 일치하는 노드입니다.
답변2
일반적으로 , 또는 와 같은 도구를 사용하여 XML을 조작하는 것은 불가능합니다 sed
. 일반 XML의 경우 XML 구문 분석 라이브러리를 사용하세요.awk
grep
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 파일이 예제와 다르게 보일 경우 이 스크립트는 가비지를 생성할 수 있습니다.