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

l0b*_*0b0 4 regex perl perl5.8

我有一个脚本(源码)来解析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  
}
Run Code Online (Sandbox Code Playgroud)

Perl 5.10的输出只包含空格,括号,分支名称,标记名称或trunk最后括号之一.Perl 5.8.8(没有最终版本p)的输出包含此加上svn info输出的每个空格分隔部分的括号版本.

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

bri*_*foy 11

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

 perl -ne 'print if s/.../.../'
Run Code Online (Sandbox Code Playgroud)

对于Perl v5.8和v5.10,我会以同样的方式做到这一点.我不知道你怎么想的/p修改正在做,因为你不使用$`,$&$'变量或他们每个比赛等价物.

您可以在perlrun中阅读有关命令行开关的信息.


Dal*_*aen 6

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

你发布的单行内容从不使用那些变量,所以省略了/p.

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

perl -ne 's/search/replace/ and print'
Run Code Online (Sandbox Code Playgroud)

将仅打印进行更换的行.注意-n-p开关.另外,我-p /p在我的5.10上尝试过这个组合,它也很高兴地打印出未经改动的非匹配线.也许我错过了什么......