【问题标题】:Return only matches from substitution in Perl 5.8.8 (was: Perl "p" regex modifier equivalent)仅从 Perl 5.8.8 中的替换返回匹配项(之前是:Perl "p" 正则表达式修饰符等效)
【发布时间】:2011-05-25 04:47:00
【问题描述】:

我有一个脚本 (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)包含这个加上svn info 输出的每个空格分隔部分的括号版本。

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

【问题讨论】:

  • 你能解释一下你想做什么 - 给出一个输入文件和你期望的输出。
  • 也许我听起来像是一张卡住的唱片,但“你能解释一下你想要做什么 - 给出一个输入文件和你期望的输出”。您提出了很多半成品的解决方案,但我无法弄清楚您想要什么。

标签: regex perl perl5.8


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,就是这样!我误解了/p 以及它的作用。不过,Perl 5.10 没有打印所有行仍然很奇怪。
【解决方案2】:

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

而且您发布的单行代码从不使用这些变量,因此请省略 /p

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

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

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

【讨论】:

  • 澄清了问题 - 问题更多的是 Perl 返回的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多