我正在尝试使用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选项吗?我确信这很简单。
答案 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///
表达式希望一次对整个文件进行操作,因此在此模式下无效。