2013-11-12 2 views
0

Im соскабливает файл и пытается найти первое появление «silverlight #», где «#» - номер версии. Им в настоящее время с помощьюcat in perl Regex получает слишком много совпадений

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 

Как я могу напечатать только первое появление шаблона, а не все в файле?

+1

Любая конкретная причина, по которой вы используете perl? – Flimzy

ответ

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; }' 
+4

Я также предлагаю убить 'cat', использовать' perl -ne 'if/(Silverlight \ d)/{print $ 1; last;} '' – Hasturkun

+0

спасибо, что это была волшебная пуля –

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

Это говорит: в цикле ввода/вывода через STDIN или файлы (-n), ищите матч (/.../ и $1) и распечатайте его с новой линией (say, подразумеваемой -E), если мы еще не видели (%seen) it.

Update

я неправильно интерпретировал запрос OP еще для печати «первое вхождение шаблона», как «первый экземпляр каждого отдельного матча», который является не то, что он хочет. Это то, что он хочет:

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

В этом случае скобки для say необходимы, чтобы не понимать как say($1, exit).

Смежные вопросы