Truncando colunas de arquivo textos no Linux

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

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6