전체 xml 파일을 읽고 특정 조건이 충족되는지 검색한 다음 일부 특정 줄을 삭제하는 쉘 스크립트를 작성해야 합니다.
내 XML이 다음 형식이라고 가정합니다.
<midget action="D">
<lists operator="AND">
<list name="productCode" value="XW143215" actionoperator="in"
oldoperator="in" type="string" />
<list name="%%PromotionProductInstanceId%%" value="z" product="S0000001.S0145868"
actionoperator="in" operator="=" oldoperator="in" type="string" />
<list name="Type" value="ALL" product="PQRAccess" type="string" />
<lists id="Prim" />
</lists>
</midget>
<midget action="Y">
<lists operator="AND">
<list name="productCode" value="XW143215" actionoperator="in"
oldoperator="in" type="string" />
<list name="Y" value="z" product="S0000001.S0145868"
actionoperator="in" operator="=" oldoperator="in" type="string" />
<list name="Type" value="ALL" product="PQRAccess" type="string" />
<lists id="Trim" />
</lists>
</midget>
<midget action="D">
<lists operator="AND">
<list name="productCode" value="XW143215" actionoperator="in"
oldoperator="in" type="string" />
<list name="%%PromotionProductInstanceId%%" value="z" product="S0000001.S0145868"
actionoperator="in" operator="=" oldoperator="in" type="string" />
<list name="Type" value="ALL" product="PQRAccess" type="string" />
<lists id="Trim" />
</lists>
</midget>
이제 내 쉘 스크립트는 다음 조건을 검색합니다.
- 시작 요소는 다음과 같아야 합니다.
<midget
- 어떤 작업 = "D"
- 그런 다음 목록 요소 name="%%PromotionProductInstanceId%%"에서
- 그런 다음 목록 요소 값 = "ALL"
그런 다음 스크립트는 midget 요소에서 이 두 명령문을 제거해야 합니다.
<list name="%%PromotionProductInstanceId%%" value="z" product="S0000001.S0145868"
actionoperator="in" operator="=" oldoperator="in" type="string" />
<list name="Type" value="ALL" product="PQRAccess" type="string" />
sed를 사용해 보았지만 위의 조건에 따라 검색을 수행하는 방법을 알 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다.
답변1
그리고XmlStarlet:
xml ed -d '//midget[@action="D"]/*[
descendant::list[@name="%%PromotionProductInstanceId%%"] and
descendant::list[@value="ALL"]]/list[
@name="%%PromotionProductInstanceId%%" or @value="ALL"]' <file.xml
상세히:
- 시작 요소는 다음과 같아야 합니다
<midget
.//midget
- 그 위에
action="D"
:[@action="D"]
- 그런 다음 목록 요소에서 다음을 수행합니다
name="%%PromotionProductInstanceId%%"
.descendant::list[@name="%%PromotionProductInstanceId%%"]
- 그런 다음 목록 요소에서 다음을 수행합니다
value="ALL"
.descendant::list[@value="ALL"]
- 그런 다음 스크립트는 midget 요소에서 다음 두 명령문을 제거해야 합니다.
list[@name="%%PromotionProductInstanceId%%" or @value="ALL"]