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提示执行.svn
perl
bri*_*foy 11
如果您只想从匹配的行输出,请不要使用-p
命令行开关.它打印$_
每个循环结束时的值.您可能需要使用-n
命令行开关:
perl -ne 'print if s/.../.../'
Run Code Online (Sandbox Code Playgroud)
对于Perl v5.8和v5.10,我会以同样的方式做到这一点.我不知道你怎么想的/p
修改正在做,因为你不使用$`
,$&
或$'
变量或他们每个比赛等价物.
从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上尝试过这个组合,它也很高兴地打印出未经改动的非匹配线.也许我错过了什么......