이것이 내가 생각해낸 것이지만 여러 줄에서는 작동하지 않습니다.
sed -i '/<!-- my comment -->.*<!-- \/my comment end -->/d' my_file
답변1
sed
기본 모드는 한 줄씩 실행되므로 혼란스러운 한 가지 접근 방식은 내용 \x00
을 입력하기 전에 개행 문자를 다른 문자(예: NULL 문자)로 바꾸는 것 입니다 sed
.
tr '\n' '\x00' <my_file
sed
그런 다음 콘텐츠를 행으로 처리합니다. 하지만,
sed -e 's/<!-- my comment -->.*<!-- \/my comment end -->//'
의 탐욕스러운 일치 특성으로 인해 작동하지 않습니다 sed
. 주석의 모든 내용을 첫 번째 문자까지 일치시켜 비탐욕적 일치를 달성할 수 있지만 이는 HTML 주석에 우리가 가정할 수 없는 문자(특히 다른 HTML 태그)를 <
포함하는 것이 허용되지 않는 경우에만 작동합니다 .<
이 문제를 해결하기 위해 시퀀스를 <!
파일의 다른 곳에서는 사용되지 않는 단일 문자로 변환하여 비탐욕적인 일치 항목을 구성할 수 있습니다. \x01
이 목적을 위해 특수 문자를 선택하고 탐욕 <!
스럽지 않은 일치 후에 해당 특수 문자로 다시 변환합니다.
sed -e $'s/<!/\x01/g' -e $'s/\x01-- my comment -->[^\x01]*\x01-- \/my comment end -->//g'
( 리터럴 단일 바이트 문자 \x01을 에 전달하는 $''
대신 쉘 구문을 사용하십시오 )''
sed
세 번째 단계에서는 NULL 문자가 다시 개행 문자로 변환됩니다.
tr '\x00' '\n'
마지막으로 빈 줄은 다른 호출에 의해 억제됩니다 sed
.
sed -e '/^$/d'
즉,
tr '\n' '\x00' <my_file |sed -e $'s/<!/\x01/g' -e $'s/\x01-- my comment -->[^\x01]*\x01-- \/my comment end -->//g' |tr '\x00' '\n'|sed -e '/^$/d'
awk
대신 다른 도구( 또는 perl
단일 라이너) 를 사용하기로 선택한 경우 sed
다음과 같은 더 우아한 솔루션이 있습니다.
perl -0pe 's/<!-- my comment -->.*?<!-- \/my comment end -->//gs' my_file