我有一个脚本(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提示执行。
答案 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
组合,并且很高兴地打印出未经改动的非匹配线。也许我错过了什么......