> Agora não me pergunte o porque do '$!N', eu também não entendo. >
Tá bom... vá lá... faltou um pouco de boa vontade minha para entender a expressão. Vamos atualizar algumas conclusões: 1. O 's/\n//g' sozinho não funciona (entrada e saída permanecem iguais). Pelo que meu parco conhecimento de sed me permite concluir, dado ao fato de que o sed, após processar a linha, a devolve como uma linha (e toda linha tem uma quebra de linha no final). Então, não é que o comando não funcione. Funciona, o sed realmente remove a quebra de linha, mas ao devolvê-la, a acrescenta denovo (para que continue sendo uma linha e não se emende com a próxima), certo? 2. Então, para que funcione, é necessário juntar a linha com a próxima, através do comando 'N', e remover a quebra de linha que ficou entre elas, correto? Então, por que não fazemos apenas sed 'N;s/\n//g'? Porque senão ele faz isso uma linha sim e a outra não. Veja: r...@mga0-fwall-dsl:~> for ID in $(seq 1 100) ; do echo "Linha $ID" ; done | sed 'N;s/\n//g' Linha 1Linha 2 Linha 3Linha 4 Linha 5Linha 6 Linha 7Linha 8 Linha 9Linha 10 (...) Linha 93Linha 94 Linha 95Linha 96 Linha 97Linha 98 Linha 99Linha 100 É claro! se o sed lê o arquivo linha por linha e na primeira linha quando eu mando juntar com a segunda a terceira passa a ser segunda. Logo, o comando não será executado na segunda linha original (que virou primeira), e assim por diante. Então, o que o ':a' faz é marcar o início da primeira linha do arquivo antes de mexer nele e o 'ta' faz o sed retroceder à marcação 'a' (o início da primeira linha do arquivo) após a substituição ter sido realizada. É o tal do loop que o Aurélio mencionou. Portanto, na instrução em questão, o ta não deixa o sed avançar, mas o for a executar a instrução sempre na primeira linha, mas antes, traz a linha seguinte para junto dela? Capiche? Portanto, o que o '$!N' faz é simplesmente emendar a linha seguinte na linha atual antes da substituição. Então, o sed remove **as duas quebras de linha** (a do fim da primeira e a do fim da segunda linha), mas ao devolver a string, insere uma quebra nela para que ela continue sendo linha e não se emende com a linha seguinte do arquivo. É isso pessoal mesmo pessoal? Ah! Qual seria então a função do "$!", já que apenas o "N" funciona? Vejam: http://pastebin.com/f4442ce6 Putz... se eu tivesse pensado 5 minutos mais, não tinha passado recibo! :) Abraço