내 파일에 텍스트가 너무 많아요. ===
기호와 사이의 모든 텍스트를 제거하고 싶습니다 <!!!>
. 예를 들어 명령을 실행한 이후 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
sed
Non-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'