sed '$!N;/^\[second/,/^\n\[/P;D' <infile >outfile
Isso provavelmente deve ser feito, embora eu não esteja muito claro sobre o que você quer fazer com a linha em branco à direita que precede imediatamente a próxima seção. Essa saída inclui, porque parece a coisa certa a se fazer, mas se você quiser soltar apenas aquela última linha em branco de qualquer seção que possa ser feita com relativa facilidade - então apenas pergunte.
Basicamente, para cada linha de entrada que é !
não a $
last, sed
também extrai a linha N
ext e a anexa ao espaço de padrão após um delimitador de caractere \n
ewline inserido. Cada vez que isso acontece, o espaço padrão muda:
^Line1\nLine2$
^Line2\nLine3$
^Line3\nLine4$
Se o espaço de padrão atual corresponder aos padrões ^\[second
ou ^\n\[
ou qualquer linha que ocorra entre esses dois, sed
irá P
rint up para o primeiro \n
ewline ocorrendo no espaço padrão - e, portanto, ele imprime apenas metade de seu buffer para cada iteração.
Por último, sed
D
elimina o primeiro \n
ewline no espaço padrão e inicia o script novamente a partir do topo - que é como obtemos o efeito de deslocamento. Isso é conhecido como janela deslizante . Funciona muito bem e é bastante rápido.
Eu acho que existem várias versões desta pergunta ou algo assim? Seja qual for o caso, indo pelo caminho oposto não é tão difícil de fazer, realmente.
Você pode fazer como ...
sed -ne '/^\[[^s]/,/^\[s/p' <in >out
O que seria apenas imprimir qualquer conteúdo que não siga um cabeçalho começando com um caractere s
e todos os cabeçalhos, independentemente. No entanto, ele não faz a pequena nova linha depois:
[first attempt]
a=10
b=20
[second attempt]
[third attempt ]
a=30
b=50
Se você quiser ficar um pouco mais explícito, pode fazer isso também:
sed '/^\[[second]/P;$!N;//,/\n$/!P;D' <in >out
... o que faz a pequena linha nova ...
[first attempt]
a=10
b=20
[second attempt]
[third attempt ]
a=30
b=50
Todos esses são sed
ranges e, para cada expressão de correspondência que se parece com:
/match1/,/match2/command
... sed
aplicará o command
nas linhas combinadas e em todas as linhas intermediárias.