셸 스크립트를 사용하여 XML 태그를 읽은 다음 XML 태그를 제거하십시오. <body_start>

다음과 같은 입력이 주어집니다.

<start>
   <header>
      This is header section
   </header>
   <body>
      <body_start>
         This is body section
         <a>
            <b>
               <c>
                  <st>111</st>
               </c>
               <d>
                  <st>blank</st>
               </d>
            </b>
         </a>
      </body_start>
      <body_section>
         This is body section
         <a>
            <b>
               <c>
                  <st>5</st>
               </c>
               <d>
                  <st>666</st>
               </d>
            </b>
            <b>
               <c>
                  <st>154</st>
               </c>
               <d>
                  <st>1457954</st>
               </d>
            </b>
            <b>
               <c>
                  <st>845034</st>
               </c>
               <d>
                  <st>blank</st>
               </d>
            </b>
         </a>
      </body_section>
   </body>
</start>

다음 파싱을 수행하고 싶습니다.

경우 st의 값 c태그는 154다음 전체는 <b>합니다 </b>제거에 대한 요구를 태그. 값 154는 파일에 존재하거나 존재하지 않을 수 있습니다.

따라서 값 154가 있으면 다음 부분을 제거해야합니다.

<b>
   <c>
      <st>154</st>
   </c>
   <d>
      <st>1457954</st>
   </d>
</b>

쉘 스크립트로 코딩하고 싶습니다. xslt시스템이 지원하지 않기 때문에 사용할 수 없습니다 .



답변

pupHTML 처리를위한 명령 줄 도구 인를 사용할 수 있습니다 . XML의 경우을 사용할 수 있습니다 xpup.

예를 들어, 제거 할 부품을 찾으려면 다음을 실행하십시오.

$ pup ':parent-of(:parent-of(:contains("154")))' <file.html
<b>
 <c>
  <st>
   154
  </st>
 </c>
 <d>
  <st>
   1457954
  </st>
 </d>
</b>

sed( file.htmlHTML 파일이 있는 곳 )을 사용하여 입력에서이 섹션을 제거하려면 다음을 실행하십시오.

 sed "s@$(pup ':parent-of(:parent-of(:contains("154")))' <file.html | xargs | tr -d " ")@@g" <(xargs <file.html | tr -d " ")

노트:

  • xargs <file.html | tr -d " "공백없이 파일을 한 줄로 병합하는 데 사용 합니다.
  • 언급 된 pup명령을 사용 하여 제거 패턴을 찾습니다.
  • 우리는 다음 sed을 통해 패턴을 제거합니다 sed "s@PATTERN@@g" <(input).
  • 현재 위치를 바꾸려면 (파일을 수정하여) -iGNU sed또는 -i'.bak'BSD를 추가하십시오 sed.

이해하기 쉽도록 다음 스크립트를 사용할 수 있습니다.

function flat_it() { xargs | tr -d " "; }
input=$(flat_it <file.html)
remove=$(pup ':parent-of(:parent-of(:contains("154")))' <<<$input | flat_it)
sed "s@$remove@@g" <<<$input

참고 : 위 방법의 단점은 내용을 포함하여 모든 공백이 제거된다는 것입니다. 더 나은 결과를 얻으려면 다른 평탄화 입력 방법을 사용해야합니다.

그래서 대신에 xargs | tr -d " ", sed, ex또는 paste사용할 수 있습니다.

다음은 다음을 사용하는 예입니다 ex.

ex +%j +"s/[><]\zs //g" +%p -scq! file.html

다음은 쉘 기능이있는 버전입니다 (이전 버전을 대체 할 수 있음).

function flat_it() { ex +%j +"s/[><]\zs //g" +%p -scq! /dev/stdin; }


답변