【问题标题】:How can I use Perl regexp characters when inside a bash script?在 bash 脚本中如何使用 Perl 正则表达式字符?
【发布时间】:2011-04-12 03:13:02
【问题描述】:

我想要一个可以在任何文件上运行的命令行函数来将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 中开箱即用的任何东西。

【问题讨论】:

    标签: php regex perl bash shell


    【解决方案1】:

    你应该转义你的简单引号并删除最后一个括号:

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

    【讨论】:

    • 我在转义单引号时获取 .bashrc 文件时出现以下错误:bash: /home/tom/.bashrc: line 214: unexpected EOF while looking for matching ' - 但如果我使用双引号,一切都很好谢谢你的信息。
    • 还是错了。通过将' 替换为",您将$1 的含义从Perl 的第一个匹配变量更改为bash 的第一个函数参数。您应该保留外部单引号并专注于根据 bash 规则正确转义内部单引号。
    • @daxim 这只是一个错字,$ 应该被转义。在这段代码'"'"' 中,外部单引号真的很难看,因为单引号有点太多了。答案已重新编辑。
    【解决方案2】:

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

    【讨论】:

    • aha - 谢谢我应该在写问题时从语法突出显示中发现这一点!用反斜杠转义单引号会使命令无法获取源代码。
    • '$1' 变为 '\''$1'\''。我使用String::ShellQuote 模块。
    • @daxim 不,它没有。它都在外壳单引号内。这意味着$1 受到外壳的保护。问题是通过关闭单引号外壳字符串(并在之后立即重新打开它)取消了保护。我一直说perl -nle 'print $1 if /foo="(.*)"/'
    • 我不知道你在这里争论什么。如果想将foo 'bar' quux 引用到外部perl -e'…' 中,它确实会变成foo '\''bar'\'' quux。这在bash manual 中并不明显,但可以轻松验证。
    • @daxim 啊,我看错了你写的东西。我以为你是说有两层引用必须完成。
    【解决方案3】:

    如果原来的 Perl 语句有效,就会找到

    include("something.php") 
    

    并写了

    include 'something.php')
    

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

    以下似乎按照 OP 的预期方式工作:

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

    【讨论】:

    • 谢谢马丁。是的,很抱歉在正则表达式中有一个不正确的“)”字符并在我的问题中使用了不正确的扩展名。我已经对其进行了编辑以关注主要问题 - 即如何转义单引号。
    猜你喜欢
    • 2010-09-23
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2021-12-26
    • 2014-05-31
    相关资源
    最近更新 更多