![특정 조건에서 특정 문자열을 바꾸는 쉘 스크립트](https://linux55.com/image/118229/%ED%8A%B9%EC%A0%95%20%EC%A1%B0%EA%B1%B4%EC%97%90%EC%84%9C%20%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8.png)
전체 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"]