Esses dias estava implementando um sistema para com troca de arquivos entre empresas bancárias e por um erro no desenvolvimento acabei inserindo 5 espaços em branco no final de uma linha. O arquivo precisava ter exatamente 1000 caracteres por linha e uma das linhas de milhares de arquivos estava sendo inserida com 1005 caracteres. O sistema estava em homologação e não tinha tempo e nem autorização para corrigir, gerar outra versão e enviar para publicação em ambiente de homologação. A solução foi recorrer às mágicas do Linux.
A maioria das distribuições Linux possui um utilitário chamado fold. O fold é responsável por acertar o tamanho de linhas, inclusive realizar quebra por palavras (word wrap) devidamente nos espaços (isso pode ser muito útil). No meu caso, precisaria quebrar todas as linhas exatamente no miléssimo caractere (-w 1000). Para isso executei o seguinte código:
fold -w 1000 <nomeDoArquivo>
Ele quebra a linha, mas, infelizmente no meu caso, ele joga os 5 espaços restantes na linha seguinte. O meu arquivo ao invés de ter uma única linha de 1005 caracteres passou a ter uma nova linha com 5 caracteres em branco (espaços). Para resolver esse problema, eu sabia que meu arquivo não possuia nenhuma outra linha não preenchida. E utilizei outro comando mágico: o grep.
O grep utiliza de expressão regular para exibir um determinando conjunto de linhas. O seguinte comando elimina as linhas em branco:
grep -v '^ *$' <nomeDoArquivo>
A opção "-v" significa para ignorar o que a expressão regular conseguir capturar. O "^" significa início, o "$" significa fim, e o " *" significa o espaço 0 ou mais vezes. Ou seja, o meu comando vai ignorar toda a linha que tiver 0 ou mais espaços. A partir daí foi só organizar um pequeno script para criar os meus arquivos convertidos:
for file in `ls /diretorio/arquivo* 2>/dev/null` do fold $file -w 1000 | grep -v '^ *$' > $file.conv mv $file.conv /diretorio/convertidos rm $file done
Dessa maneira os arquivos originais (/diretorio/arquivo*) serão convertidos (arquivoAlgo.conv) para o diretório: /diretorio/convertidos. Com isso ganhei um tempo para fazer a correção e todos ficaram felizes :).
Atualização: Após mais alguns milhares de arquivo, o comando ls começou a dar erro. Substitui pelo find: find /diretorio/ | grep -v '^/diretorio/$' 2>/dev/null