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

时间:2015-06-01 13:18:01

标签: regex perl 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"`

1 个答案:

答案 0 :(得分:2)

您可以使用:

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

Working Demo

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

$ echo "$tgt"
Text to keep

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

Text to keep

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

$ 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