4

我有一个脚本(源代码)来解析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 的输出(没有 final p)包含这个以及输出的每个空格分隔部分的括号版本svn info

一种可能的解决方法是在and命令grep '^URL: '之间进行简单的处理,但我希望避免这种情况,因为这将针对每个 Bash 提示符执行。svnperl

4

2 回答 2

11

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

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

对于 Perl v5.8 和 v5.10,我会采用同样的方法。我不确定您认为/p修饰符在做什么,因为您不使用$`$&$'变量或它们的每次匹配等效项。

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

于 2010-12-14T13:19:46.440 回答
6

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

而且你发布的单行从不使用这些变量,所以省略/p.

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

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

将仅打印进行替换的行。注意-n-p开关。此外,我已经-p /p在我的 5.10 上尝试了该组合,它也很高兴地打印出未更改的不匹配行。也许我错过了什么……

于 2010-12-14T11:19:31.817 回答