Pensei em outra maneira de fazer isso que não depende de linhas pareadas, mas apenas um caractere <space> após um caractere \n ewline:
sed ':n;N;s/\n */ /;tn;P;D'
Isso usa uma janela deslizante de dados de nova linha e a função t est para operar. O fluxo é assim:
- defina o rótulo
:next - acrescentar
Next na entrada ao espaço padrão -
s/elege um caractere de ewline\nseguido por 1 ou mais caracteres<space>e os substitui por um único/<space>/ -
test se a últimas///foi bem-sucedida e, em caso afirmativo, ramifique para:next label, else ... -
Print até o primeiro caractere\newline no espaço padrão e ... -
Delete até e incluindo primeiro caractere% ewline\nno espaço padrão e reinicia o ciclo com o espaço padrão restante ou com a próxima linha
Então, basicamente, todas as ocorrências de \n [ ]* na entrada são espremidas em [ ] :
sed ':n;N;s/\n */ /;tn;P;D' <<\DATA
2014-06-06 AAA
BBB
2014-06-06 CCC
DDD
2014-06-06 EEE
2014-06-06 FFF
GGG
DATA
OUTPUT:
2014-06-06 AAA BBB
2014-06-06 CCC DDD
2014-06-06 EEE
2014-06-06 FFF GGG
OLD:
sed -n 'h;n;H;x;s/\n */ /p' <<\DATA
2014-06-06 AAA
BBB
2014-06-06 CCC
DDD
DATA
OUTPUT:
2014-06-06 AAA BBB
2014-06-06 CCC DDD
Eu uso os comandos 5 sed .
- sobrescreve
hespaço antigo com espaço padrão ... - sobrescreve o espaço padrão com a linha
next na entrada - acrescente espaço padrão a
Hold space após um caractere\newline inserido automaticamente - e
xalteram o conteúdo dos espaços de retenção e padrão -
s/elege o primeiro caractere% ewline\ne qualquer um ou*de todos os espaços seguintes, em seguida,/substitui a seleção por um único espaço e/print o resultado.
No entanto, agora que penso nisso, uma versão simplificada das respostas mine e @Falsenames - que realmente é melhor que essa - seria apenas:
sed 'N;s/\n */ /' <<\DATA
2014-06-06 AAA
BBB
2014-06-06 CCC
DDD
DATA
OUTPUT:
2014-06-06 AAA BBB
2014-06-06 CCC DDD