Provavelmente, é melhor fazer isso com sed
;
veja Por que usar um loop de shell para processar texto é considerado uma prática ruim?
Por exemplo, essa pequena variação da segunda resposta ( sed
) de Costas :
sed 'N; s/\n/ /'
faz um bom trabalho ao responder a pergunta:
N
para acrescentar a próxima linha de entrada no espaço padrão
e, em seguida, s/\n/ /
para fazer a substituição.
(E então esses comandos se repetem para cada duas linhas de entrada).
Mas, se você quiser fazer isso inteiramente no shell,
esta variação da resposta de terdon :
while IFS= read -r line1
do
IFS= read -r line2; printf '%s %s\n' "$line1" "$line2"
done
funciona sem executar nenhum programa externo.
A lógica é simples (IMHO):
enquanto não no final da entrada, leia uma linha e leia outra linha,
e, em seguida, imprima as duas strings, separadas por espaços, em uma linha.
O código acima tem um problema com um caso de borda:
se a entrada for um número par de linhas bem formadas
seguido por alguns caracteres não terminados com uma nova linha,
descarta a linha final (parcial).
( a resposta de terdon tem o mesmo problema,
mas não apenas para números pares de linhas.
Isso ocorre porque read
retorna falha quando lê uma linha parcial,
mesmo que ele coloque os dados na variável.
Então a correção é esta:
while IFS= read -r line1 || [ "$line1" != "" ]
do
IFS= read -r line2; printf '%s %s\n' "$line1" "$line2"
done
que continua até que read
falhe
e definem a variável como uma string vazia.