다음과 같은 두 개의 HTML 섹션이 있는 잘못 작성된 HTML 파일이 수백 개 있습니다.
<HTML>
<HEAD>
several header lines
</HEAD>
<BODY>
hundreds of lines of content
</BODY>
</HTML>
<HTML>
dozens of lines
</HTML>
Linux에서 GNU sed 4.7을 사용하여 두 번째 HTML 섹션 전체를 제거하고 싶습니다. 나는 비슷한 것을 시도했습니다 :
sed '0,/<HTML>/! /<HTML>/,/<\/HTML>/d'
그러나 이것은 작동하지 않습니다. 다음과 같이 하고 싶지만 구문상 올바르지 않습니다.
sed '/<HTML>/2,/<\/HTML>/d'
도와주세요.
답변1
파일이 올바른 형식의 XML 문서라고 가정하면 이를 사용하여 xmlstarlet
문서 형식을 다시 지정할 수 있습니다. 이 --recover
옵션을 사용하면 유틸리티가 첫 번째 최상위 태그와 모든 내용을 출력하지만 다른 최상위 태그는 모두 삭제합니다.
예:
$ xmlstarlet fo --recover --omit-decl --noindent file >newfile
file:9.1: Extra content at the end of the document
<HTML>
^
$ cat newfile
<HTML>
<HEAD>
several header lines
</HEAD>
<BODY>
hundreds of lines of content
</BODY>
</HTML>
답변2
같은 생각@FelixJN의 답변그러나 모든 UNIX 시스템의 모든 쉘에서 awk를 사용하십시오.
$ awk '{print}; /<\/HTML>/{exit}' file
<HTML>
<HEAD>
several header lines
</HEAD>
<BODY>
hundreds of lines of content
</BODY>
</HTML>
awk -i inplace 'script' *
모든 파일을 한 번에 "제자리" 편집하고 GNU awk를 사용하려면 이것을 사용하십시오.
답변3
반대로 하면 됩니다. 모든 줄을 인쇄하고 첫 번째 항목에서 종료합니다.</HTML>
sed -ni 'p;/<\/HTML>/q' file
-i
먼저 테스트하지 않고 사용하세요.
또는 더 쉬운 방법:
sed -i '/<\/HTML>/q'