Olá pessoal,

A algum tempo que vinha tentando encontrar alguma forma, menos
deselegante possível, de substituir várias linhas em branco em
seqüência, por apenas uma linha em branco. Por exemplo:

$ cat teste.txt
1111

2222


33333



445
56
$ _

deve ficar assim:

$ cat teste-new.txt
1111

2222

33333

445
56
$ _

Fiz isto com a linha

$ sed ':i ; $! N; s/\n/N/ ; t i ; s/N\{3,\}/NN/g ; s/N/\n/g' test.txt

Para um texto qualquer é conveniente substituir o "N" por algum caracter
como "µ", "Ø", ou algum caracter não existente no texto.

Como não encontrei outras soluções na rede, resolvi expor aqui a idéia.

Explicação:
O sed está dividido em três comandos.
1  :i ; $! N; s/\n/N/; t i    => faz um laço no texto e substitui todas
alimentações de linha (\n) pelo caracter "N"
2  s/N\{3,\}/NN/g   => substitui todas as ocorrências de três N's
(N{3,})  ou mais, por dois N (uma linha em branco)
3  s/N/\n/g    => substitui os Ns por alimentação de linha (\n)

Se alguém tem alguma outra solução mais ou menos elegante para isto?
awk, outro sed, combinações diferentes de comandos...

Até,
Alves

Responder a