Aqui estão dois comandos. Se você quiser um comando que apareça até a última linha .*{$ em uma sequência (como @don_crissti com ed ) você pode fazer:
sed 'H;/{$/h;/^}/x;/{\n.*PATTERN/!d'
... que funciona anexando todas as linhas ao espaço H old após um caractere \n ewline, sobrescrevendo h old space para cada linha que corresponda a {$ e trocando h old por pattern espaços para cada linha que corresponda a ^} - e, portanto, liberando seu buffer.
Ele imprime apenas linhas que correspondem a { e, em seguida, \n ewline e, em seguida, PATTERN - e isso só acontece imediatamente após uma troca de buffer.
Ele elimina todas as linhas em uma série de {$ corresponde ao último da sequência, mas você pode obter todas essas inclusões como:
sed '/PATTERN.*\n/p;//g;/{$/,/^}/H;//x;D'
O que ele faz é padrão de troca e h espaços antigos para cada sequência de ...{$.*^}.* , anexa todas as linhas da sequência ao espaço H old após um caractere \n ewline e D elips até o primeiro caractere% e_line \n no espaço padrão para cada ciclo de linha antes de iniciar novamente com o que permanece.
Naturalmente, a única vez em que ele recebe \n ewline no espaço padrão é quando uma linha de entrada corresponde a ^} - o fim de seu intervalo - e quando ele executa novamente o script em qualquer outra ocasião a próxima linha de entrada por costume.
Quando PATTERN é encontrado no mesmo espaço de padrão que um \n ewline, ele imprime o lote antes de sobrescrevê-lo com ^} novamente (para que possa finalizar o intervalo e liberar o buffer) .
Dado este arquivo de entrada (obrigado don) :
sometext1{
string1
}
sometext2{
PATTERN
string3
}
sometext3{
string4
string5
string6
}
Header{
sometext4{
some string
string unknown
here's PATTERN and PATTERN again
and PATTERN too
another string here
}
}
As primeiras impressões:
sometext2{
PATTERN
string3
}
sometext4{
some string
string unknown
here's PATTERN and PATTERN again
and PATTERN too
another string here
}
... e o segundo ...
sometext2{
PATTERN
string3
}
Header{
sometext4{
some string
string unknown
here's PATTERN and PATTERN again
and PATTERN too
another string here
}