我有大量的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”。谁能告诉我如何解决它?
答案 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)
)中,因此您的括号也会被转义,并且您的正则表达式不会捕获任何内容。