sed를 사용하여 여러 줄 HTML 주석 제거

sed를 사용하여 여러 줄 HTML 주석 제거

이것이 내가 생각해낸 것이지만 여러 줄에서는 작동하지 않습니다.

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

관련 정보