Convertendo quebras de linha do padrão DOS para LINUX

Convertendo quebras de linha do padrão DOS para LINUX

Overview

Alguma vez já se perguntou por que aquele script que funciona maravilhosamente no Windows simplesmente se recusa a cooperar quando levado para o Linux? A resposta, muitas vezes, reside nas inesperadas quebras de linha. Neste post divertido, porém meticuloso, você será guiado através das soluções para este problema universal, explorando como ferramentas como dos2unix e SED podem ser suas novas melhores amigas na conversão desses scripts teimosos. Prepare-se para mergulhar no mundo das diferenças de formatação de texto entre sistemas operacionais e como superar esses obstáculos!

Então você faz um script ou uma série de scripts no Windows e eles funcionam perfeitamente. Quando você transfere eles para um ambiente Linux, os scripts simplesmente não funcionam por causa da diferença entre o formato da quebra de linha do Windows e do Linux. Neste post vou mostrar como fazer a conversão de um arquivo ou de todos os arquivos em um diretório.Obviamente, o ideal é que você consiga criar os scripts sem precisar deste tipo de intervenção, mas nem sempre estamos em um cenário ideal.

Para este post, vamos utilizar o dos2unix. Se ele não estiver instalado, utilize o comando abaixo:

sudo apt-get install tofrodos

A linha acima vai instalar tanto o dos2unix quanto o unix2dos (que faz o serviço contrário, ou seja, converte do formato Linux para Windows). Se ocorrer algum erro, você pode instalar apenas o dos2unix com o seguinte comando:

sudo apt-get install dos2unix

Um destes dois comandos vai funcionar corretamente. Se ambos apresentarem problemas, no final deste post eu passo uma alternativa utilizando o SED.

Ok. Agora que já temos a aplicação instalada, vamos imaginar que você quer ajustar a quebra de linha de todos os arquivos que existem a partir do diretório /tmp/app. Para isso, podemos utilizar o comando:

find /tmp/app -type f -print0 | xargs -0 dos2unix --

No comando acima temos:

  • Executamos uma chamada para o find, passando:
    • o caminho que será utilizado nas buscas (/tmp/app);
    • o argumento -type f, que indica para a aplicação que estamos buscando apenas arquivos (e ignorando diretórios)
    • o argumento -print0 (print zero), que faz a aplicação retornar a lista completa dos arquivos encontrados. A diferença entre -print e -print0 (zero) é que o -print concatena uma quebra de linha ao final de cada resultado e o -print0 (zero) concatena null ao final de cada resultado;
  • O resultado do find é passado para o xargs com os seguintes argumentos…
    • -0 (zero) indica que os argumentos passados estarão separados por um indicador null;
    • o próximo argumento passado para o xargs é dos2unix —. Os dois hifens depois do comando dos2unix indica que tudo que vier depois dele será considerado como nome de arquivo a ser processado pelo utilitário.

Alternativa: Utilizando SED

Ao invés de utilizar o dos2unix, você também pode utilizar o SED com o comando abaixo:

find /tmp/app -type f -exec sed -i 's/\r$//' {} \;

Explicando o comando acima:

  • Primeiro chamamos o comando find passando o caminho que será utilizado na busca;
  • Depois passamos o argumento type -f (que já foi explicado acima);
  • O último argumento é o -exec. Ele indica que os próximos argumentos fazem parte de uma linha de comando que será executada para cada um dos resultados encontrados. Sendo assim, vamos passar os argumentos recebidos pelo comando Sed:
    • -i indica que a substituição será feita “inline”, ou seja, ele vai realizar as substituições no arquivo sem que você tenha que gerenciar os streams dos arquivos e enviá-los para o utilitário;
    • “s/\r$//” é o regex indicando que o \r será substituído por nada, deixando apenas o caractere \n demarcando a quebra de linha;
    • o {} faz parte do argumento -exec e funciona como um placeholder para o nome do arquivo que está sendo trabalhado no momento;
    • \; está encerrando a linha de comando do sed;

Espero ter ajudado!