특정 조건에서 특정 문자열을 바꾸는 쉘 스크립트

특정 조건에서 특정 문자열을 바꾸는 쉘 스크립트

전체 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"]

관련 정보