파일에서 두 번째 줄 블록을 삭제하도록 sed를 얻으려면 어떻게 해야 합니까?

파일에서 두 번째 줄 블록을 삭제하도록 sed를 얻으려면 어떻게 해야 합니까?

다음과 같은 두 개의 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'

관련 정보