我正在浏览文件并试图找到第一次出现的“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
如何只打印模式的第一个出现,而不是文件中的每个出现?
答案 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; }'