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”