2010-09-14 59 views
0

我想,我可以在任何文件上运行一个命令行功能,通过向include("myinc.inc"); PHP语句更改为include 'myfile.inc';我已经开了一个头下面我的〜/ .bashrc文件如何在bash脚本中使用Perl正则表达式字符?

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

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

$ makestandard myfile.php 

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

我该如何解决这个问题?


背景信息(无需阅读):我们已经使用PHP_CodeSniffer (phpcs)嗅出PHP代码,并报告任何坏的“闻香”开始。不幸的是,phpcs不能解决非标准的代码,它只会报告它。因此,我想编写一个脚本来修复我们的PHP代码中一些简单和常见的非标准元素。我打算用一堆perl pie填充我的makestandard bash函数。

Shell环境:无论Ubuntu 10.04是开箱即用的。

回答

4

它不是bash的变量,它是在你的单引号的bash字符串的单引号。

+0

啊哈 - 谢谢我应该在写这个问题时从语法高亮中发现了这个问题!用反斜杠转义单引号会使命令无法获得源代码。 – Tom 2010-09-14 12:23:06

+1

''$ 1''变成''''''''''''。我使用['String :: ShellQuote'](http://p3rl.org/String::ShellQuote)模块。 – daxim 2010-09-14 13:38:35

+0

@daxim不,它不。它全部在单引号内。这意味着'$ 1'受到保护。问题在于通过关闭单引号外壳字符串来取消保护(并在之后立即重新打开)。如果/ foo =“(。*)”/'“,我会说'perl -nle'打印$ 1。 – 2010-09-14 14:43:12

5

你应该逃脱你简单一个引号删除最后一个括号:

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

:'bash下的/ home /汤姆

以下似乎工作的OP希望的方式/.bashrc:第214行:意外的EOF,同时寻找匹配的' - 但如果我使用双引号,所有感谢信息。 – Tom 2010-09-14 12:01:33

+0

为什么这是upvoted? Bash引用不起作用。 – daxim 2010-09-14 13:36:12

+0

@daxim,我的坏它已更新 – 2010-09-14 13:48:47

0

原来的Perl语句,如果它的工作,会发现

include("something.php") 

和书面

include 'something.php') 

也就是说,它会删除左括号和单取代双引号。并且不会根据需要更改扩展名。当我采购我的.bashrc * *文件时,我逃单引号我收到以下错误

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

谢谢马丁。对不起,在正则表达式中使用不正确的“)”字符,并在我的问题中使用了不正确的扩展名。我已经编辑它来关注主要问题 - 即如何逃避单引号。 – Tom 2010-09-14 16:23:53