É um pouco confuso com sed
, mas é possível:
sed -n '
:start
/^\[/{
h
:loop
n
/^\[/b start
/^$/b loop
x;p;g
}
p'
-n
significa imprimir nada por padrão. :start
é apenas um rótulo para um futuro posterior. Nós combinamos as linhas que começam com [
e iniciamos um grupo ({...}) de comandos.
Copiamos a linha para o espaço de espera (h). Nós obtemos a próxima linha (n). Se isso
começa [
nós tivemos uma seção vazia, então goto (b) o começo novamente.
Se a linha estiver vazia (/ ^ $ /), lemos outra linha (goto loop). A linha não está vazia, então trocamos a linha com o cabeçalho da seção retida (x), imprimimos o cabeçalho da seção (p), recuperamos a linha atual (g) e continuamos fora do grupo de comandos para imprimir (p) a linha . Este último (p) também imprime cabeçalhos sem seção.