Просто хотел перефразировать предыдущие ответы немного по-другому; обратите внимание, что в этом случае:
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /Xy = 3/;'
1
... мы распечатываем 1 - как в «да, у меня есть совпадение». Если мы хотим вернуть совпавший текстовый фрагмент, как указано @ markusk , « использует скобки в регулярном выражении для захвата подстрок »:
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = 3)/;'
Xy = 3
Однако учтите, что у вас могут возникнуть проблемы с конкатенацией строк при использовании этой идиомы:
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /Xy = 3/ . "\n";'
1 # OK
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = 3)/ . "\n";'
1 # NOT OK
... так что, вероятно, лучше хранить вещи отдельно в этом случае:
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = 3)/ ; print "\n";'
Xy = 3 # OK again
Однако, если мы хотим захватить «что-то», скажем, цифру, то, поскольку мы используем скобки, мы автоматически возвращаем только это совпадение с этой идиомой (а не всю строку «искомого»):
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /Xy = (\d)/ ; \
print "\n";'
3
... таким образом, чтобы захватить искомую строку во всей ее полноте, мы должны снова заключить ее в скобки:
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = (\d))/ ; \
print "\n";'
Xy = 33
.... но мы не получаем того, что ожидаем, потому что теперь есть два совпадения, $1
и $2
; и, очевидно, идиома «print $str =~ /.../
» выводит все совпадения (в данном случае «$1$2
»).
Таким образом, чтобы получить только искомую строку в этом случае вложенных совпадений, теперь у нас есть для явного указания только $1
:
$ perl -e '$str="the variable Xy = 3 in this case"; $str =~ /(Xy = (\d))/ ; \
print "$1 \n";'
Xy = 3
РЕДАКТИРОВАТЬ октябрь 2013 г .: через Назначить одно или несколько совпадений регулярных выражений переменной в виде однострочного Perl (массив разыменования?) - это также можно сделать для одного линейного элемента:
$ perl -e '$str="the variable Xy = 3 in this case"; \
print ( ( $str =~ /(Xy = (\d))/ )[1] ); print "\n";'
3
... однако, обратите внимание на необходимость второго заключающего в скобки набора скобок для print
для непосредственной работы с возвращаемым (анонимным?) Массивом регулярных выражений.
Наконец, в многострочном контексте сначала убедитесь, что весь файл / текст «хлебает» в одну строку; затем используйте /s
(однострочный режим = сопоставление новой строки) и /g
(глобальное / множественное совпадение) - и, наконец, убедитесь, что выражение совпадения находится в цикле while
, чтобы выполнить итерацию по всем совпадениям :
$ echo "some data
IN
123
OUT
some more data
is about to follow:
IN
256
OUT
done with data
out" | perl -e '$str = do { local $/; <> }; while ($str =~ /(IN(.*?)OUT)/sg) { print "$1\n"} '
IN
123
OUT
IN
256
OUT
Ну, надеюсь, это кому-нибудь поможет,
Ура!