猫进入perl Regex获得太多比赛

时间:2013-11-12 14:20:45

标签: regex perl

我正在浏览文件并试图找到第一次出现的“silverlight#”,其中“#”是版本号。我目前正在使用

cat silver.txt | perl -e 'while ($line = <>) {if ($line =~/Silverlight \d/) { $line =~/(Silverlight \d)/; print "$1\n";}}'

它可以工作,但由于我在文件中找到的模式不止一次,我得到以下输出。

Silverlight 5
Silverlight 5
Silverlight 5
Silverlight 5
Silverlight 5
Silverlight 5
Silverlight 4
Silverlight 4
Silverlight 4
Silverlight 4
Silverlight 3
Silverlight 3
Silverlight 3
Silverlight 3
Silverlight 2
Silverlight 2
Silverlight 2
Silverlight 1

如何只打印模式的第一个出现,而不是文件中的每个出现?

2 个答案:

答案 0 :(得分:5)

perl -nE 'say $1 if /(Silverlight \d)/ and not $seen{$1}++;' silver.txt

这说:在STDIN上的I / O循环或作为参数(-n)给出的文件中,查找匹配项(/.../$1)并打印出来如果我们尚未看到(say),则换行符(-E隐含%seen)。

<强>更新

我误读了OP打印“第一次出现的模式”作为“每个不同匹配的第一个实例”的请求,这不是他想要的。这就是他想要的:

perl -nE 'say($1), exit if /(Silverlight \d)/' silver.txt

在这种情况下,say的括号是必要的,以免被理解为say($1, exit)

答案 1 :(得分:2)

如果要在打印一个结果后退出,为什么不在打印一个结果后退出?

cat silver.txt | perl -e 'while ($line = <>) {if ($line =~/Silverlight \d/) { $line =~/(Silverlight \d)/; print "$1\n"; exit }}'

一个更简单的完全相同的版本:

cat silver.txt | perl -e 'while (<>) {if (/(Silverlight \d)/) { print "$1\n"; exit; }}'

或者:

cat silver.txt | perl -e 'while (<>) { /(Silverlight \d)/ && print "$1\n" && exit; }'