Tenho arquivos que terminam em uma ou mais novas linhas e devem terminar em apenas uma nova linha. Como posso fazer isso com as ferramentas Bash / Unix / GNU?
Exemplo de arquivo incorreto:
1\n
\n
2\n
\n
\n
3\n
\n
\n
\n
Exemplo de arquivo corrigido:
1\n
\n
2\n
\n
\n
3\n
Em outras palavras: deve haver exatamente uma nova linha entre o EOF e o último caractere não-nova linha do arquivo.
Implementação de referência
Leia o conteúdo do arquivo, corte uma única nova linha até que não haja mais duas novas no final e escreva de volta:
#! /bin/python
import sys
with open(sys.argv[1]) as infile:
lines = infile.read()
while lines.endswith("\n\n"):
lines = lines[:-1]
with open(sys.argv[2], 'w') as outfile:
for line in lines:
outfile.write(line)
Esclarecimento: É claro que a tubulação é permitida, se isso for mais elegante.