" " 태그 사이의 텍스트를 제거합니다 . 여기서 " "는 다른 줄에 있을 수 있습니다.

" " 태그 사이의 텍스트를 제거합니다 . 여기서 " "는 다른 줄에 있을 수 있습니다.

td.txt다음 내용이 포함된 텍스트 파일이 있습니다.

More here || <--field="data.com":CHK test text--> || test 2 test x @ -- 
||<!-- more data 
here --> ||
echo "||<!--field="data.com":CHK test text-->|| test 2 test x @ -- ||<--field="data.com":CHK more data here -->|| test data

모든 인스턴스를 삭제하고 싶습니다.<!-- and all text inside the tags -->

sed이런 표현이 있어요cat td.txt | sed 's/<!--[^P]*-->//g'

필요에 따라 태그와 그 내용을 제거하지만 <!--태그가 한 줄에서 시작하고 다른 줄에서 끝나는 경우에는 제거되지 않습니다 -->.

위 식을 사용한 결과는

More here || <--field="data.com":CHK test text--> || test 2 test x @ -- 
||<!-- more data 
here --> ||
echo "|||| test data

보여주다

<!-- more data 
    here -->

태그가 아직 존재합니다

<!-- and all text inside the tags -->및의 모든 인스턴스를 삭제하는 방법
<!-- and all text
inside the tags -->

sed나 grep 또는 다른 도구를 사용하시나요?

답변1

XML 문서에서 주석을 제거하려면 다음을 사용할 수 있습니다 xmlstarlet.

xmlstarlet ed -d '//comment()' file.xml

주석이 여러 줄에 걸쳐 있는지 여부는 중요하지 않습니다.

이 도구는 xmlstarlet( ) 옵션을 통해 내부 편집을 지원합니다.-L--inplace

답변2

나는 다음을 사용할 것이다 perl:

perl -0777 -pe 's/<!--.*?-->//sg' < your-file

여기서 -psed모드를 활성화하면 -0777레코드 구분 기호를 불가능한 문자로 변경합니다. 이는 전체 파일이 하나의 레코드(슬러프 모드)로 처리되고 s///sg정규 표현식과 일치하는 모든 항목을 <!--.*?-->빈 문자로 바꾸는 것을 의미합니다. 이 s플래그는 .개행 문자와도 일치 g하며 이런 일이 처음뿐만이 아닙니다.

입력을 XML로 구문 분석하지 않기 때문에 입력이 유효한 XML인지는 상관하지 않으므로 입력이 유효한 XML이 아닌 경우에도 작동하지만 이론적으로는 다음과 같은 경우 해당 항목을 제거하게 될 수 있습니다 <!--. 그 중 일부는 -->XML 주석이 아닙니다.<!CDATA[

을 사용하면 sed다음과 같은 작업을 수행할 수 있습니다.

sed ':1
     $!{
       N;b1
     }
     s/_/_u/g; s/(/_</g; s/)/_>/g; # escape _, ( and ) characters
     s/<!--/(/g; s/-->/)/g; # replace <!-- and --> with
                            # single characters ( and )

     s/([^)]*)//g; # remove the comments

     s/)/-->/g; s/(/<!--/g; # revert earlier replacement
     s/_>/)/g; s/_</(/g; s/_u/_/g; # revert earlier escaping'

표준에는 Perl 의 연산자(탐욕적이지 않은 버전 ) sed가 없기 때문에 with 및 로 바꾸는 대신 에 자신 과 문자를 원래 와 (그리고 ) 로 입력하세요 .*?*([^)]*)())<!--(-->)()_<_>__u

전체 입력을 미리 패턴 공간으로 빨아들이는 루프에 주목하세요(일부 sed구현에는 패턴 공간 크기에 대한 하한이 있지만 GNU는 그렇지 않습니다 sed).

답변3

sed '/<!--/!b;:1;/-->/!{N;b1};s/-->/\a/;s/<!--.*\a//' file

라벨이 나타나면 <!--라벨이 있는지 확인하고 -->, 없으면 버퍼에 라인을 추가하고 라벨 1을 반환합니다. 첫 번째 -->레이블을 텍스트 파일에 없는 문자로 바꿉니다. 라벨에서 앵커까지 제거하세요.\r\f\a<!--

작업을 복잡하게 만들어 봅시다. 여러 검색 태그가 한 줄에 동시에 나타날 수 있다고 가정합니다.

awk 'NR>1 {sub(/-->/,"\r"); sub(/.*\r/, "")}1' RS='<!--' ORS= file

아마도 GNU awk만이 이 마지막 솔루션에 적합할 것입니다. 왜냐하면 파일에 구분 기호가 없으면 <!--완전히 버퍼로 읽혀지기 때문입니다.

관련 정보