perl regex在脚本中工作,但在命令行上执行时则不行

时间:2013-12-01 03:27:46

标签: regex perl command-line

我正在尝试使用perl在文件中操作多行CoffeeScript注释。这是我的正则表达式:

^\t*###[\S\s]*?^\t*###

当我在一个数据是文件数据的脚本中运行它时,它会按照我的预期执行,并用“foo”替换所有多行注释:

$data =~ s{^\t*###[\S\s]*?^\t*###}{"foo"}gme;

但是,当我在命令行上运行它时,文件保持不变:

perl -pi -e 's{^\t*###[\S\s]*?^\t*###}{"foo"}gme' file.coffee

我使用了不同正则表达式的类似命令,没有'm'选项,它们都有效。是导致问题的m选项吗?我确信这很简单。

2 个答案:

答案 0 :(得分:4)

-n-p设置的隐式循环中,定义$/$\的值会很有用。使用-0选项将Perl置于段落模式,特殊值0777将Perl置于文件slurp模式。

perl -0777 -i -pe 's{^\t*###[\S\s]*?^\t*###}{"foo"}gme' file.coffee

答案 1 :(得分:3)

-n / -p选项的perl文档声明:

assume "while (<>) { ... }" loop around program

这意味着每次执行-e表达式时,$_都是输入文件的一行。您的s///表达式希望一次对整个文件进行操作,因此在此模式下无效。