Com o GNU sed:
sed ':loop /\(.*|\)\{4\}.*/ !{N; s/\n//; b loop}; s/ *| */|/g' file
O comando dissecado:
:loop
O :
sinaliza um rótulo que podemos usar para filiais. "loop" é apenas o nome que escolhi para o marcador.
/\(.*|\)\{4\}.*/
É um regex de seletor de linha que corresponde a linhas que contêm 4 símbolos de pipe, cada um permitido ser precedido por zero ou mais caracteres arbitrários ( .*|
), com zero ou mais caracteres arbitrários permitidos para seguir o último canal.
!{ ... }
Aplica os comandos nos colchetes a qualquer linha que não corresponda à regex anterior.
N; s/\n//; b loop
N
concatena a linha atual em espaço padrão com um símbolo de nova linha e a próxima linha do arquivo de origem, então s/\n//
remove o símbolo de nova linha e b loop
ramificações de volta ao rótulo nós definimos no início, então a linha concatenada será comparada com a regex novamente.
Por último
s/ *| */|/g
será aplicado a qualquer linha no espaço padrão antes de sua saída. Isso remove todos os espaços ao redor dos símbolos de tubos.