【问题标题】:How can I extract a string enclosed in single quotes in Perl?如何在 Perl 中提取用单引号括起来的字符串?
【发布时间】:2012-01-04 17:15:59
【问题描述】:

如何使用 Perl 正则表达式从“abc”中提取 abc?

我试过了

echo "'abc'" | perl -ne 'if(/\'(.*)\'/) {print $1}'

但它显示:

-bash: 意外标记 `(' 附近的语法错误

【问题讨论】:

标签: regex perl


【解决方案1】:

这不是 Perl 问题;这是一个 shell 问题:您不能将单引号包含在单引号中。

您必须将每个单引号替换为'\''(单引号结尾、转义单引号和单引号开头):

echo "'abc'" | perl -ne 'if(/'\''(.*)'\''/) {print $1}'

【讨论】:

    【解决方案2】:

    在单引号 Perl 代码前面加上一个美元符号,以指示 Bash 使用 alternate quoting method 来关闭 shell 扩展:

    echo "'abc'" | perl -ne $'if(/\'(.*)\'/) {print $1}'
    

    【讨论】:

      【解决方案3】:

      您遇到的是 shell 引用问题,而不是 Perl 问题。

      这是sed的好用处:

      echo "'abc'" | sed "s/'//g"
      

      【讨论】:

        【解决方案4】:

        choroba's answer 解决了确切的问题。对于任何引用问题的通用解决方案,请使用String::ShellQuote

                        $ alias shellquote='perl -E'\''
                            use String::ShellQuote qw(shell_quote);
                            local $/ = undef;
                            say shell_quote <>;
                        '\'''
                        $ shellquote
        user input →    if(/'(.*)'/) {print $1}␄
        perl output →   'if(/'\''(.*)'\''/) {print $1}'
        

        【讨论】:

          【解决方案5】:

          嗯,便宜的方法是不要用单引号将您的 Perl 语句括起来:

          echo "'abc'" | perl -ne "if(/'(.*)'/) {print $1}"
          

          Shell 转义有奇怪的规则...

          如果你真的想以“正确”的方式来做,你可以结束你的第一个单引号字符串,放入引号,然后开始另一个:

          echo "'abc'" | perl -ne 'if(/'\''(.*)'\''/) {print $1}'
          

          【讨论】:

          • 第一个解决方案只有在 shell 的 $1 中没有任何内容时才有效。
          • 不应使用双引号,甚至不应将双引号作为第一建议提及,因为 shell 和 Perl 语法的重叠比问题中的 $1 更多。 Backwhacking any $ 对人类来说很容易出错,而且很快就会让人厌烦。
          【解决方案6】:

          您需要使用 ''' 转义单引号:

          echo "'abc'" | perl -ne 'if( /'\''(.*)'\''/ ){print $1}'

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多