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
:n
ext - acrescentar
N
ext na entrada ao espaço padrão -
s/
elege um caractere de ewline\n
seguido por 1 ou mais caracteres<space>
e os substitui por um único/<space>/
-
t
est se a últimas///
foi bem-sucedida e, em caso afirmativo, ramifique para:n
ext label, else ... -
P
rint até o primeiro caractere\n
ewline no espaço padrão e ... -
D
elete até e incluindo primeiro caractere% ewline\n
no 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
h
espaço antigo com espaço padrão ... - sobrescreve o espaço padrão com a linha
n
ext na entrada - acrescente espaço padrão a
H
old space após um caractere\n
ewline inserido automaticamente - e
x
alteram o conteúdo dos espaços de retenção e padrão -
s/
elege o primeiro caractere% ewline\n
e qualquer um ou*
de todos os espaços seguintes, em seguida,/
substitui a seleção por um único espaço e/p
rint 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