Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 替换终端中所有文件中的多行字符串_Regex_Perl_Terminal - Fatal编程技术网

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

Regex 替换终端中所有文件中的多行字符串,regex,perl,terminal,Regex,Perl,Terminal,我在一个目录中有几个文件,其中两个分隔符之间有一段文本 Text to keep //###==### Text to remove //###==### Text to keep 经过广泛的搜索,我发现了下面的macosx终端命令,通过它我可以删除分隔符本身 perl -pi -w -e 's|//###==###||g' `find . -type f` 但是,我需要一个正则表达式,它不仅要删除分隔符本身,还要删除中间的内容。类似这样的,虽然这条线没有任何作用 perl -pi -w

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

Text to keep

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

Text to keep
经过广泛的搜索,我发现了下面的macosx终端命令,通过它我可以删除分隔符本身

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`
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
命令标志清除整个文件,然后:

$ 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

您没有收到以下错误:
文件名、目录名或卷标语法不正确。
perl-ne'打印,除非m |/###=###|。。。m |/####=####|
@robarl的评论应该是一个答案。这就是range操作符的用法。谢谢!:-)带有-0777的选项似乎工作正常。有没有一种方法可以在所有文件上执行此操作,并以相同的操作保存文件?这似乎可以解决这个问题(由于撇号的含义冲突,字体看起来很奇怪):$perl-0777-p-i-e's/(^\s*^\/\\\/\\\\\\\\==\\\\\\\\\\\\\/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\-键入f-名称“index.php”