替换终端中所有文件中的多行字符串

Replace multiline string in all files in terminal

我在一个目录中有几个文件,其中两个分隔符之间有一段文本。

Text to keep

//###==###
Text to remove
//###==###

Text to keep

经过广泛搜索,我发现了以下 Mac OS X 终端命令,我可以使用它自己删除分隔符。

perl -pi -w -e 's|//###==###||g' `find . -type f`

但是,我需要一些带有正则表达式的东西,它不仅可以删除分隔符本身,还可以删除它们之间的内容。类似这样的东西,虽然这一行没有做任何事情。

perl -pi -w -e 's|//###==###(.*)//###==###||g' `find . -type f`

重复标记后编辑

我看到类似的东西 here,使用标量范围运算符,但我无法让它为我工作。失败的尝试包括:

perl -pi -w -e 's|//###==###..//###==###||g' `find . -type f`
perl -pi -w -e 's|//###==###(..)//###==###||g' `find . -type f`
perl -pi -w -e 's|//###==###[..]//###==###||g' `find . -type f`

解决方案

在下面的 dawg 的帮助下,下面的 oneliner 将完全按照我的要求进行操作:

$ perl -0777 -p -i -e 's/(^\s*^\/\/###==###.*?\/\/###==###\s*)//gms' `find . -type f -name "index.php"`

您可以使用:

s/(^\s*^\/\/###==###.*?\/\/###==###\s*)//gms

Working Demo

然后在终端和 Perl 中。给定:

$ echo "$tgt"
Text to keep

//###==###
Text to remove
//###==###

Text to keep

使用 -0777 命令标记 slurp 整个文件,然后:

$ echo "$tgt" | perl -0777 -ple 's/(^\s*^\/\/###==###.*?\/\/###==###\s*)//gms'
Text to keep
Text to keep

或者,您可以使用范围运算符。如果这样做,如果这是您的意图,则不能删除前导和尾随空白行:

$ echo "$tgt" | perl -lne 'print unless (/\/\/###==###/ ... /\/\/###==###/)'
Text to keep


Text to keep