Php 在bash脚本中如何使用Perl regexp字符?

Php 在bash脚本中如何使用Perl regexp字符?,php,regex,perl,bash,shell,Php,Regex,Perl,Bash,Shell,我想要一个命令行函数,我可以在任何文件上运行,以更改includemyinc.inc;PHP语句包括“myfile.inc”;首先,我将以下内容添加到我的~/.bashrc文件中: I来源~/.bashrc;并在命令行中运行命令,如下所示: $ makestandard myfile.php 我修改了myfile.php,但是没有捕获包含的文件名,而是将包含的文件名损坏为当前文件的名称。作为一个未知的猜测,我认为bash$1变量干扰了$1 perl regexp变量 我怎样才能解决这个问题 背

我想要一个命令行函数,我可以在任何文件上运行,以更改includemyinc.inc;PHP语句包括“myfile.inc”;首先,我将以下内容添加到我的~/.bashrc文件中:

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

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

我怎样才能解决这个问题

背景信息无需阅读:我们已经开始使用嗅探PHP代码并报告任何异味。不幸的是,phpcs没有修复非标准代码,它只报告它。因此,我想制作一个脚本,修复PHP代码中一些简单而常见的非标准元素。我计划用一堆代码填充我的makestandardbash函数


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

您应该对简单的引号进行转义,并删除最后一个括号:

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

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

如果原始Perl语句起作用的话,就会找到它

include("something.php") 

include 'something.php')
也就是说,它将删除左括号,并用单引号替换双引号。。未按要求更改分机

以下内容似乎与OP预期的工作方式相同:

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

当我转义单引号时,当我获取.bashrc文件的源代码时,我得到了以下错误:bash:/home/tom/.bashrc:line 214:在寻找匹配项时出现意外的EOF'-但如果我使用双引号,一切都很好,因此感谢您提供的信息。它仍然是错误的。通过交换'for',您将$1的含义从Perl的第一个匹配变量更改为bash的第一个函数参数。您应该保留外部单引号,并根据bash规则将注意力集中在正确转义内部单引号上。@daxim这只是一个拼写错误,应该转义$。在这段代码中,外部的单引号会非常难看,因为单引号太多了。答案已被重新编辑。啊哈-谢谢,我应该在写问题时从语法突出显示中发现这一点!用反斜杠转义单引号会使命令无法进行源代码转换。“$1”变为“\$1”。我使用模块。@daxim不,它不使用。它是一个外壳内的所有单引号。这意味着$1不受shell的影响。问题是,通过关闭单引号外壳字符串并在随后立即重新打开它,取消了保护。我一直在说perl-nle'print$1 if/foo=.*/'。我不知道你在争论什么。如果想将foo'bar'qux包含到外部perl-e'…'中,它实际上会变成foo'\bar'\qux。这一点从表面上看并不明显,但可以验证。@daxim啊,我误读了你写的东西。我以为你是说有两层引用必须完成。谢谢马丁。是的,很抱歉regexp中的字符不正确,并且在我的问题中使用了不正确的扩展名。我对其进行了编辑,以关注主要问题,即如何避开单引号。
function makestandard() {
    perl -p -i -e 's/include\("(\w+)\.inc"\)/include("$1.php")/g' $*
}