替换终端中所有文件中的多行字符串
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
然后在终端和 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
我在一个目录中有几个文件,其中两个分隔符之间有一段文本。
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
然后在终端和 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