0

我浏览了一个文件并试图找到第一次出现的“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

我怎样才能只打印模式的第一次出现,而不是文件中的每一个?

4

2 回答 2

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

这就是说:在通过 STDIN 或作为参数 ( -n) 给出的文件的 I/O 循环中,查找匹配项 ( /.../and ) 并使用换行符 (隐含)$1打印它,如果我们还没有看到 ( ) 它。say-E%seen

更新

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

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

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

于 2013-11-12T14:31:11.100 回答
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; }'
于 2013-11-12T14:24:33.180 回答