【问题标题】:perl regex works in script but not when executed on the command lineperl 正则表达式在脚本中有效,但在命令行上执行时无效
【发布时间】:2013-12-01 03:27:46
【问题描述】:

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

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

当我在 data 是文件数据的脚本中运行它时,它会按照我的预期执行并将所有多行 cmets 替换为“foo”:

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

但是,当我在命令行上运行它时,文件没有改变:

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

我使用了具有不同正则表达式且没有“m”选项的类似命令,它们都可以工作。是导致问题的 m 选项吗?我敢肯定这很简单。

【问题讨论】:

  • 我很好奇文件系统是否将\t 作为文字标签字符而不是实际的正则表达式标签?如果您尝试转义反斜杠会发生什么?
  • 将反斜杠转义为\\t?
  • 是的,试一试。不知道它是否会起作用:)
  • 我跑了perl -pi -e 's{^\\t*###[\S\s]*?^\\t*###}{"foo"}gme' file.coffee 仍然没有快乐。

标签: regex perl command-line


【解决方案1】:

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

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

【讨论】:

  • 感谢您将此作为任何偶然发现此问题的人的答案。
【解决方案2】:

-n/-p 选项的 perl 文档指出:

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

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

【讨论】:

  • 有什么方法可以从命令行一次性操作整个文件?
  • 不是我能找到的地方,但你可能会这样做:perl -e 'local $/; $data = &lt;&gt;; $data =~ s/find/replace/; print $data' &lt; file &gt; file.new &amp;&amp; mv file.new file
  • 不错。感谢您的帮助。
  • @RyanLynch 你可以下载文件。
  • 试试这个perl -0777 -i -pe 's{^\t*###[\S\s]*?^\t*###}{"foo"}gme' file.coffee
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2017-03-26
  • 2013-02-07
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多