【问题标题】:Replace multiline string in all files in terminal替换终端中所有文件中的多行字符串
【发布时间】:2015-06-02 17:41:35
【问题描述】:

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

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"`

【问题讨论】:

  • 您没有收到此错误:The filename, directory name, or volume label syntax is incorrect.?
  • perl -ne 'print unless m|//###==###| ... m|//###==###|'
  • @RobEarl 的评论应该是一个答案。这就是范围运算符的使用方式。

标签: regex perl terminal


【解决方案1】:

你可以使用:

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

【讨论】:

  • 谢谢! :-) -0777 的选项似乎工作正常。有没有办法对所有文件执行此操作,并在同一操作中保存文件?
  • 这似乎适用(由于撇号的冲突含义,字体看起来很奇怪): $ perl -0777 -p -i -e 's/(^\s*^\/\ /###==###.*?\/\/###==###\s*)//gms' find . -type f -name "index.php"
猜你喜欢
  • 1970-01-01
  • 2013-02-20
  • 2011-10-11
  • 1970-01-01
  • 2023-03-26
  • 2011-11-24
  • 2017-01-10
  • 1970-01-01
相关资源
最近更新 更多