Usando sed
:
$ sed -n '/This is the start/{h;d;}; H; /This is the ending/{x;p;}' file
[This is the start] of some other data
this is info I want
this is info I want
[This is the ending I was looking for]
Script sed
anotado:
/This is the start/{ # We have found a start
h; # Overwrite the hold space with it
d; # Delete from pattern space, start next cycle
};
H; # Append all other lines to the hold space
/This is the ending/{ # We have found an ending
x; # Swap pattern space with hold space
p; # Print pattern space
};
O que o script faz é salvar todas as linhas no "espaço de espera" (um buffer de uso geral em sed
), mas assim que encontramos uma "linha de partida", redefinimos esse espaço. Quando uma "linha final" é encontrada, os dados salvos são impressos.
Isso quebra se uma "linha final" for encontrada antes de uma "linha inicial" e possivelmente também se duas "linhas finais" forem encontradas sem nenhuma "linha inicial" entre elas.
Um programa awk
que executa o mesmo procedimento que o programa sed
acima:
$ awk '/This is the start/ { hold = $0; next }
{ hold = hold ORS $0 }
/This is the ending/ { print hold }' file
(saída idêntica como acima)