适用于复杂替换的Perl语法

时间:2010-09-28 17:26:59

标签: regex perl syntax

我有大量的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”。谁能告诉我如何解决它?

2 个答案:

答案 0 :(得分:4)

为什么不做以下事情:

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命令行操作符。

答案 1 :(得分:2)

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