Seu segundo script sed
,
N
s/\n/ /
não funciona da maneira esperada, pois lerá uma linha e, em seguida, anexará a próxima linha a ela com uma nova linha inserida pelo comando N
e, em seguida, substituirá essa nova linha por um espaço (e saída). Ao ler a linha depois, esse resultado das duas primeiras linhas é descartado.
Em vez disso, você teria que usar o espaço de espera:
H; # append to hold space with a '\n' embedded
# for the last line:
${
x; # swap in the hold space
s/\n//; # delete the first newline (from the H command on the very first line of input)
y/\n/ /; # replace all other newlines with spaces
p; # print result
}
Esse script está sendo executado uma vez para cada linha de entrada, coletando dados no espaço de espera até chegarmos à última linha. Na última linha, processamos os dados coletados e os geramos.
Você executaria isso com sed -n
:
$ sed '=' <file2 | sed -n 'H; ${ x; s/\n//; y/\n/ /; p; }'
1 this is 2 not is 3 is is 4 this biz
(não há nova linha no final da saída, pois não havia nenhuma no final da entrada).
Como alternativa, com um loop explícito, podemos usar N
. O truque aqui é nunca chegar ao final do script até que estejamos prontos para imprimir o resultado.
:top; # define label 'top'
N; # append next line with a '\n' embedded
$!btop; # if not at end, branch to 'top'
y/\n/ /; # replace all newlines with spaces
# (implicit print)
Este script só é executado (até o final) uma vez e gerencia a leitura dos dados enquanto o script anterior foi alimentado com dados pelo loop de leitura interno em sed
(que substitui o espaço padrão para cada linha lida, qual foi o seu problema). Ele usa o espaço de padrão, em vez do espaço de armazenamento, para coletar os dados e processá-los quando a última linha foi lida.
Na linha de comando:
$ sed '=' <file2 | sed ':top; N; $!btop; y/\n/ /'
(mesma saída acima)