정규식을 사용하여 파일에서 텍스트 제거

정규식을 사용하여 파일에서 텍스트 제거

내 파일에 텍스트가 너무 많아요. ===기호와 사이의 모든 텍스트를 제거하고 싶습니다 <!!!>. 예를 들어 명령을 실행한 이후 Text ===some comments<!!!> lala ===aaa<!!!>"여야 합니다 . Text lala나는 그것을 시도했지만 sed -i -E "s/(===(.*)<!!!>)//" file작동하지 않았습니다.

편집하다:

Text ===

some commenkjghkb

ufjhbgdfxjhg


srtdfts

</!!!> 

lala ===aaa

</!!!>"```

~해야 한다Text lala

답변1

Perl 정규식을 사용하면 할 수 있습니다욕심이 없다성냥:

perl -pe 's/===.*?<!!!>//g' file

편집 1:텍스트를 삽입하려면 다음을 사용하십시오.

perl -pe 's/===.*?<!!!>/Text you want to insert/g' file

편집 2:여러 줄 주석을 처리해야 하는 경우 다음을 사용할 수도 있습니다.

perl -pe 'BEGIN{undef $/;} s|===.*?</!!!>|insert|gs' file

s개행 문자와도 일치할 수 있는 수정자를 사용해야 합니다 .. 입력 구분자인 perl 변수는 $/undef로 변경되어야 합니다. 이는 "후루룩 소리(slurp)" 모드라고도 합니다.

답변2

sedNon-greedy는 지원되지 않습니다 *. 다음 트릭을 사용해야 합니다.

sed 's/_/_u/g;s/|/_p/g;s/<!!!>/|/g
     s/===[^|]*|//g
     s/|/<!!!>/g;s/_p/|/g;s/_u/_/g'

또는 일부 sed구현을 통해:

sed 's/<!!!>/\
/g; s/===[^\n]*\n//g; s/\n/<!!!>/g'

편집에 따라 여러 줄 일치를 지원하려면 최신 버전의 GNU sed에서 첫 번째 with -z옵션을 사용하거나(파일에 NUL 문자가 포함되어 있지 않다고 가정) 다음과 같은 것을 사용할 수 있습니다.

sed ':1
     $!{
       N
       b1
     }
     s/_/_u/g;s/|/_p/g;s/<!!!>/|/g
     s/===[^|]*|//g
     s/|/<!!!>/g;s/_p/|/g;s/_u/_/g'

관련 정보