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
}