sed XML은 x 줄에서 시작하여 다음 줄 번호를 반환합니다.

sed XML은 x 줄에서 시작하여 다음 줄 번호를 반환합니다.

XML에서 태그 섹션을 제거하고 중지하려면 닫는 태그를 찾아야 합니다.

XML 예

<SearchPattern> 
     <something></something>
</SearchPattern>

<OtherTag></OtherTag>

<SearchPatternHit2>
    <something></something>
</SearchPatternHit2>

반복 1 이후 필수 XML 출력의 예

<OtherTag></OtherTag>

<SearchPatternHit2>
    <something></something>
</SearchPatternHit2>

반복 2 이후 필수 XML 출력의 예

<OtherTag></OtherTag>

현재 시도에서는 sed를 사용하여 다음과 같이 처음으로 나타나는 줄 번호를 찾습니다.

start_line = $(grep -n "<${SEARCH_PATTERN}" ${FILE_PATH} | head -1| cut -f1 -d':')

출력은 행 번호 정수입니다.

그런 다음 다음을 사용하여 닫는 태그가 있는 줄을 얻으려고 했습니다.

finish_line = $(sed -n "${start_line},$ !d;/<\/${LEADING_TAG}>/=" ${FILE_PATH} | head -1)

검색 패턴의 인스턴스가 여러 개 있을 때 끝 줄 결과가 잘못되어 첫 번째 끝 표시를 얻지 못한다고 생각합니다.

이 예에서 패턴은 1행과 7행에 있습니다. 첫 번째 패스에서는 start_line=1이지만 Finish_line은 예상대로 3을 반환하지 않습니다.

이 두 값을 얻은 후 작동하는 간단한 sed 문을 호출합니다.

sed -i "${start_line}, ${finish_line}d" ${FILE_PATH}

각 블록에서 닫는 태그 라인을 얻는 더 좋은 방법은 무엇입니까?

답변1

XML을 편집하는 올바른 방법은 공백 추가 또는 다른 행 레이아웃과 같은 표시 형식 변경을 처리할 수 있는 XML 파서를 사용하는 것입니다. 현재 나의 최고 선택은 입니다 xmlstarlet.

유효한 XML 문서가 주어지면:/tmp/xml

<?xml version="1.0"?>
<root>
  <SearchPattern>
    <something/>
  </SearchPattern>

  <OtherTag/>

  <SearchPatternHit2>
    <something/>
  </SearchPatternHit2>

  <SearchPatternHit2>
    <something_else/>
  </SearchPatternHit2>
</root>

<searchPattern/>이 부분은 아주 간단하게 제거 할 수 있습니다

xmlstarlet edit -d '//SearchPattern' /tmp/xml

중복된 요소 중 하나를 제거하려면 배열 참조(1부터 시작)를 포함하십시오.

xmlstarlet edit -d '//SearchPatternHit2[1]' /tmp/xml

답변2

약간 해킹된 간단한 솔루션을 찾았지만 시스템에 다른 도구를 넣을 수 없으므로 이것이 제 솔루션입니다.

내 스크립트는 각 조각을 XML에 넣기 전후에 공통 주석을 추가합니다. 그런 다음 grep을 사용하여 찾을 수 있고 동일한 간단한 sed 문을 사용하여 쉽게 제거할 수 있습니다.

새로운 XML

1. <!-- START MY CONFIG ADDITIONS-->
2. <SearchPattern> 
2.      <something></something>
3. </SearchPattern>
4. <!-- END MY CONFIG ADDITIONS-- 
5.
6. <OtherTag></OtherTag>
7.
8. <!-- START MY CONFIG ADDITIONS--> 
9. <SearchPatternHit2>
10.     <something></something>
11. </SearchPatternHit2>
12. <!-- END MY CONFIG ADDITIONS-->

새 변수

start_line=$(grep -n "<!-- START MY CONFIG ADDITIONS-->" ${FILE_PATH} | head -1 | cut -f1 -d':')
finish_line=$(grep -n "<!-- END MY CONFIG ADDITIONS-->" ${FILE_PATH} | head -1 | cut -f1 -d':')

암호

count=$(grep -c "<!-- START MY CONFIG ADDITIONS-->" ${FILE_PATH})

while [ $count -gt 0 ]; do
    start_line=$(grep -n "<!-- START MY CONFIG ADDITIONS-->" ${FILE_PATH} | head -1 | cut -f1 -d':')
    finish_line=$(grep -n "<!-- END MY CONFIG ADDITIONS-->" ${FILE_PATH} | head -1 | cut -f1 -d':')

    sed -i "${start_line}, ${finish_line}d" $FILE_PATH

    ((count--))
done

관련 정보