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