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
여기서 -p
이 sed
모드를 활성화하면 -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만이 이 마지막 솔루션에 적합할 것입니다. 왜냐하면 파일에 구분 기호가 없으면 <!--
완전히 버퍼로 읽혀지기 때문입니다.