
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