Матч Perl oneliner повторяется - PullRequest
0 голосов
/ 01 декабря 2011

Я пытаюсь прочитать определенный раздел строки из файла с помощью Perl.Файл, о котором идет речь, имеет следующий синтаксис:

# Sets $USER1$ 
$USER1$=/usr/....
# Sets $USER2$ 
#$USER2$=/usr/...

Мой oneliner прост,

perl -ne 'm/^\$USER1\$\s*=\s*(\S*?)\s*$/m; print "$1";' /my/file

Почему-то я получаю извлечение за $ 1, повторенное несколько раз, по-видимомуодин раз для каждой строки в файле после моего совпадения.Что мне здесь не хватает?

Ответы [ 4 ]

5 голосов
/ 01 декабря 2011

Вы выполняете печать для каждой строки файла, потому что печать вызывается для каждой строки, независимо от того, соответствует ли регулярное выражение или нет.Заменить первый ; на &&.

2 голосов
/ 01 декабря 2011

От perlre:

ПРИМЕЧАНИЕ. Неудачные совпадения в Perl не сбрасывают переменные сопоставления, что облегчает написание кода, который проверяет ряд более конкретных случаев и запоминает лучшее совпадение.

Попробуйте вместо этого:

perl -ne 'print "$1" if m/^\$USER1\$\s*=\s*(\S*?)\s*$/m;' /my/file
1 голос
/ 01 декабря 2011
$ cat test.txt
# Sets $USER1$ 
$USER1$=/usr/....
# Sets $USER2$ 
#$USER2$=/usr/...

$ perl -nle 'print if /^\$USER1/;' test.txt
$USER1$=/usr/....
0 голосов
/ 01 декабря 2011

Попробуйте это

perl -ne '/^.*1?=([\w\W].*)$/;print "$1";' file
...