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:
1 | 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:
1 | 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:
1 2 3 4 5 6 | 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