【问题标题】:Proper Perl syntax for complex substitution用于复杂替换的正确 Perl 语法
【发布时间】:2010-09-28 17:26:59
【问题描述】:

我有大量 PHP 文件和行需要从标准更改 echo "string goes here"; 语法为: custom_echo("string goes here");

这是我试图打入 Perl 以实现此目的的行: perl -pi -e 's/echo \Q(.?*)\E;/custom_echo($1);/g' test.php 不幸的是,我犯了一些小的语法错误,它至少没有改变“test.php”。谁能告诉我怎么解决?

【问题讨论】:

  • Perl 不是首字母缩写词。
  • 其实是首字母缩写。但它仍然拼写为“Perl”。
  • 其实它不是的缩写。但是有几个反义词。 en.wikipedia.org/wiki/Perl#Name

标签: regex perl syntax


【解决方案1】:

为什么不这样做:

perl -pi -e 's|echo (\".*?\");|custom_echo($1);|g' file.php

我不认为 \Q\E 正在做你认为他们正在做的事情。它们不是引号的开头和结尾。它们是在你输入一个特殊的正则表达式字符(如.)的情况下——如果你用\Q ... \E包围它,那么特殊的正则表达式字符就不会被解释。

换句话说,您的正则表达式正在尝试匹配您可能没有的文字字符串(.?*),因此不会进行替换。

你也有你的 ?* 倒退 - 我假设你想匹配非贪婪,在这种情况下你需要把 ? 作为一个非贪婪修饰符 .* 字符.

编辑:我也强烈建议这样做:

perl -pi.bak -e ... file.php

这将创建一个“备份”文件,将原始文件复制到该文件中。在上面的示例中,它将创建一个名为 file.php.bak 的文件,其中包含原始的预替换内容。这在测试期间非常有用,直到您确定您已经正确构建了正则表达式。该死,磁盘很便宜,我建议始终使用-pi.bak 命令行运算符。

【讨论】:

  • 谢谢!正是我笨拙地试图达到的目标。在进行任何重大更改之前,我总是 rsync 我的数据。 :)
【解决方案2】:

您将分组括号放在元引用表达式 (\Q(pattern)\E) 内而不是外部 ((\Qpattern\E)),因此您的括号也会被转义,并且您的正则表达式不会捕获任何内容。

【讨论】:

  • 你是不是倒着进进出出?
  • 嗯,这少了一个问题,但我似乎还有更多问题。
  • @Matt Kane 不这么认为......我的意思是把它解析为“你把它们放在里面,但你应该把它们放在外面”
  • 哦,抱歉,我没有意识到外面的一组括号并不是代码部分的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2017-10-03
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
相关资源
最近更新 更多