Resposta rápida
sed ':a;N;$!ba;s/\n/ /g' file
- : a crie um rótulo 'a'
- N anexa a próxima linha ao espaço do padrão
- $! se não for a última linha , ba branch (vá para) rotule 'a'
- s substitui , / \ n / regex por nova linha , / / por um espaço , / g de correspondência global (quantas vezes for possível)
O sed percorrerá as etapas de 1 a 3 até alcançar a última linha, ajustando todas as linhas no espaço padrão onde o sed substituirá todos os caracteres \ n
Alternativas
Todas as alternativas, ao contrário do sed , não precisarão chegar à última linha para iniciar o processo
com bash , lento
while read line; do printf "%s" "$line "; done < file
com velocidade perl , tipo sed
perl -p -e 's/\n/ /' file
com tr , mais rápido que sed , pode substituir por apenas um caractere
tr '\n' ' ' < file
com pasta , velocidade tipo tr , pode substituir por apenas um caracter
paste -s -d ' ' file
com velocidade awk , tipo tr
awk 1 ORS=' ' file
Outra alternativa como "echo $ (<file)" é lenta, funciona apenas em arquivos pequenos e precisa processar o arquivo inteiro para iniciar o processo.
5.10 Por que não consigo combinar ou excluir uma nova linha usando a
seqüência de escape \ n ? Por que não consigo combinar duas ou mais linhas usando \ n?
O \ n nunca corresponderá à nova linha no final da linha, porque a
nova linha é sempre removida antes da linha ser colocada no
espaço do padrão. Para inserir 2 ou mais linhas no espaço do padrão, use
o comando 'N' ou algo semelhante (como 'H; ...; g;').
O Sed funciona assim: o sed lê uma linha de cada vez, corta a
nova linha final, coloca o que resta no espaço do padrão onde
o script sed pode endereçá-lo ou alterá-lo e, quando o espaço do padrão
é impresso, anexa uma nova linha ao stdout (ou para um arquivo). Se o
espaço do padrão for total ou parcialmente excluído com 'd' ou 'D', a
nova linha não será adicionada nesses casos. Assim, scripts como
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
NUNCA funcionará, porque a nova linha à direita é removida antes que
a linha seja colocada no espaço do padrão. Para executar as tarefas acima,
use um destes scripts:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
Como versões do sed diferente do GNU sed têm limites para o tamanho do
buffer de padrão, o utilitário 'tr' do Unix é o preferido aqui.
Se a última linha do arquivo contiver uma nova linha, o GNU sed adicionará
essa nova linha à saída, mas excluirá todas as outras, enquanto tr
excluirá todas as novas linhas.
Para corresponder a um bloco de duas ou mais linhas, há três opções básicas:
(1) use o comando 'N' para adicionar a linha Próxima ao espaço do padrão;
(2) use o comando 'H' pelo menos duas vezes para anexar a linha atual
ao espaço de espera e, em seguida, recupere as linhas do espaço de espera
com x, g ou G; ou (3) use intervalos de endereços (consulte a seção 3.3 acima)
para corresponder às linhas entre dois endereços especificados.
As opções (1) e (2) colocam \ n no espaço do padrão, onde
podem ser endereçadas conforme desejado ('s / ABC \ nXYZ / alfabeto / g'). Um exemplo
de uso de 'N' para excluir um bloco de linhas aparece na seção 4.13
("Como faço para excluir um bloco de linhas consecutivas específicas ?"). Este
exemplo pode ser modificado alterando o comando delete para
outra coisa , como 'p' (impressão), 'i' (inserção), 'c' (alteração), 'a' (anexo)
ou 's' (substituto) .
Choice (3) não vai colocar um \ n no espaço padrão, mas não
coincidir com um bloco de linhas consecutivas, por isso pode ser que você não
precisa mesmo o \ n para encontrar o que você está procurando. Desde o GNU sed
versão 3.02.80 agora suporta esta sintaxe:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
além dos
endereços de intervalo tradicionais '/ daqui /, / para lá / {...}' , pode ser possível evitar o uso de \ n completamente.
tr
é apenas a ferramenta certa para o trabalho se substituir um único caractere por um único caractere, enquanto o exemplo acima mostra substituir nova linha por um espaço. Portanto, no exemplo acima, tr poderia funcionar .. Mas seria limitador posteriormente.