Perl - сопоставить многострочный шаблон с подстановочным знаком - PullRequest
0 голосов
/ 26 мая 2020

У меня есть этот пример файла test.txt:

aba
aca

ada

bcd
baa

Я хотел бы найти все случаи, когда за строкой, начинающейся с a и заканчивающейся a, следует другая такая же строка. Однако мои попытки тщетны:

perl -0777 -ne 'print "$1\n" while /(a.*a/n)/sg' test.txt 
(...) # Matches the whole file as it starts with "a" and ends with "a\n"
perl -0777 -ne 'print "$1\n" while /(a.*?a\n)/sg' test.txt # What is this even
aba

aca

ada

aa
perl -0777 -ne 'print "$1\n" while /(a.*a\n){2}/sg' test.txt
aca

ada

bcd
baa

perl -0777 -ne 'print "$1\n" while /(a.*?a\n){2}/sg' test.txt
aca

Это мои результаты на OSX. Может ли кто-нибудь помочь мне с желаемым рисунком?

1 Ответ

2 голосов
/ 26 мая 2020

Не используйте /s, чтобы можно было сопоставить строки. Кроме того, добавьте ^ и $ с /m, чтобы соответствовать началу и концу строки:

perl -0777 -ne 'print "$1\n" while /^(a.*a)\n(a.*a)$/mg'

Или обрабатывайте построчно, запоминая предыдущую строку, если она совпадает.

perl -lne '($q) = /^(a.*a)$/; print $p if $p && $q; $p = $q'

Обратите внимание, что эти два решения различаются тем, как они обрабатывают более двух a.*a строк, идущих последовательно. См. Комментарий ikegami для альтернативного решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...