仅返回Perl 5.8.8中的替换匹配(是:Perl“p”正则表达式修饰符等效)

时间:2010-12-14 10:25:50

标签: regex perl perl5.8

我有一个脚本(source)来解析svn info,为Bash的$PS1创建一个合适的字符串。不幸的是,这不适用于我正在使用的运行Perl 5.8.8的系统 - 它输出所有行而不是仅匹配。什么是Perl 5.8.8相当于以下内容?

__svn_ps1()
{
    local result=$(
        svn info 2>/dev/null | \
        perl -pe 's;^URL: .*?/((trunk)|(branches|tags)/([^/]*)).*;\2\4 ;p')
    if [ -n "$result" ]
    then
        printf "${1:- (%s)}" $result
    fi  
}

Perl 5.10的输出只包含空格,括号,分支名称,标记名称或trunk之一以及末尾括号。 Perl 5.8.8的输出(没有最终的p)包含 plus svn info输出的每个以空格分隔的部分的括号版本。

可能的解决方法涉及grep '^URL: 'svn命令之间的简单perl,但我希望避免这种情况,因为这将针对每个Bash提示执行。

2 个答案:

答案 0 :(得分:11)

如果您只想从匹配的行输出,请不要使用-p命令行开关。它在每个循环结束时打印$_的值。您可能需要使用-n命令行开关:

 perl -ne 'print if s/.../.../'

对于Perl v5.8和v5.10,我会以同样的方式执行此操作。我不确定您认为/p修饰符的作用是什么,因为您不使用$`$&$'变量或它们的匹配等价物。

您可以在perlrun中了解命令行开关。

答案 1 :(得分:6)

从perl 5.10开始,/p开关告诉perl将匹配的内容放入${^PREMATCH}${^MATCH}${^POSTMATCH}

您发布的单行内容从未使用过这些变量,因此省略/p

更新:试图跟上最初的问题......

perl -ne 's/search/replace/ and print'

仅打印要进行更换的行。注意-n-p切换。另外,我已经尝试了我的5.10上的-p /p组合,并且很高兴地打印出未经改动的非匹配线。也许我错过了什么......