Método-a
perl -l -0777ne 'print /^(xyz.*?^End$(?:\nEnd$)*)/ms' yourfile
Trabalhando
- Slurp o arquivo para que ele apareça como uma string looooong que pode ser desmembrada usando o regex apropriado. O regex neste caso é:
- procure por xyz no início de uma linha (não necessariamente no arquivo).
- procure o End on a line mais próximo e depois quantas linhas consecutivas.
Método 2
perl -lne '
next unless /xyz/ ... eof;
last if !/End/ and $flag;
$flag ||= 1 if /End/;
print;
' yourfile
Trabalhando
- Aqui operamos o Perl em uma base por linha e configuramos uma pequena máquina de estado.
- Rejeitar qualquer porção fora do intervalo do arquivo.
- Quando entramos no intervalo certo, imprimimos todas as linhas até atingirmos a linha / End /. Nesse momento, colocamos a bandeira.
- Então, saímos assim que vemos a primeira linha não final / final.
Método 3
sed -e '
/xyz/!d
:a
$q;N
/\nEnd$/!ba
:b
n
/End/bb
d
' yourfile
Neste método, operamos o primeiro loop do-while (: a) que irá acumular linhas começando de / xyz / para / End /.
O segundo loop do-while (: b) imprime linhas até a próxima linha ser / End /.
Método 4
sed -e '
/xyz/,/End/!d
H;/xyz/h;/End/!d
:a
$q;N
/\(.*\)\n$/!{g;q;}
s/.*\n//;H
ba
' yourfile
Com esse método, primeiro selecionamos o intervalo correto e, em seguida, armazenamos esses dados de intervalo no espaço de armazenamento. O loop do-while (: a) é o setup que acrescenta incrementalmente ao espaço hold enquanto a próxima linha passa a ser / End /.
Resultados
xyz
A1
B1
C1
D1
End
End
End