如何在bash脚本中使用Perl正则表达式字符?

时间:2010-09-14 11:47:12

标签: php regex perl bash shell

我想要一个命令行函数,我可以在任何文件上运行,将include("myinc.inc"); PHP语句更改为include 'myfile.inc';我已经开始将以下内容添加到我的〜/。 bashrc 文件:

function makestandard() {
    perl -p -i -e 's/include\("([\w\.]+)"\)/include '$1'/g' $*
}

source ~/.bashrc;并在命令行中运行命令,如下所示:

$ makestandard myfile.php

我修改了 myfile.php ,但是不是捕获包含的文件名,而是包含的文件名已损坏为当前文件的名称。作为一个不知情的猜测,我认为bash $1变量干扰了$1 perl regexp变量。

我该如何解决这个问题?


背景信息(无需阅读):我们已经开始使用PHP_CodeSniffer (phpcs)来嗅探PHP代码并报告任何不好的“气味”。不幸的是,phpcs没有修复非标准代码,只报告它。因此,我想制作一个脚本来修复PHP代码的一些简单和常见的非标准元素。我打算用一堆perl pie填充我的makestandard bash函数。

Shell环境:Ubuntu 10.04中的开箱即用。

3 个答案:

答案 0 :(得分:5)

你应该从你的简单引号中删除最后一个括号:

perl -p -i -e "s/include\(\"([\w\.])+\"\)/include '\$1'/g" $*

答案 1 :(得分:4)

它不是bash变量,而是单引号bash字符串中的单引号。

答案 2 :(得分:0)

最初的Perl声明如果有效,就会找到

include("something.php") 

并撰写

include 'something.php')

也就是说,它会删除左括号并用双..替换双引号,而不是根据需要更改扩展名。

以下似乎与OP的预期方式相同:

function makestandard() {
    perl -p -i -e 's/include\("(\w+)\.inc"\)/include("$1.php")/g' $*
}