使用正则表达式从文件中删除文本

使用正则表达式从文件中删除文本

我的文件中有很多文本。我想删除符号===和之间的所有文本<!!!>。例如 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'

相关内容