Aqui está uma solução em Perl:
perl -nlE '
if (/a/) { @buffer = ($_) }
elsif (/xyz/) { push @buffer,$_; say for @buffer }
else { push @buffer,$_}
' your_file
Como isso funciona
Ele lê o arquivo linha por linha e faz uma de três coisas:
- Se a linha atual corresponder ao padrão
a
, ela atribuirá a linha atual à matriz@buffer
. - Se a linha atual corresponder ao padrão
xyz
, ele envia a linha atual para o buffer e imprime o conteúdo do buffer - Se nenhum dos dois casos acima for verdadeiro, basta anexar a linha atual à matriz
@buffer
.
Assim, sempre que uma nova linha corresponder ao padrão a
, o conteúdo do @buffer
será apagado e substituído apenas pela linha atual. Isso garante que você encontrará o mais próximo a
anterior xyz
.
Você deve substituir os regexes que usei com os regexes reais relevantes para o seu caso.