Remover carriage return de arquivos no Linux

Remover carriage return de arquivos no Linux

Ao se deparar com probremas de carriage return em um arquivo no linux, temos algumas opções para resolver tal problema, este post busca mostrar como resolver o mesmo com o uso do comando sed.

Para a explicação adiante, será utilizado o arquivo disk_report.sh

Uma breve explicação sobre o problema

Ao ser desenvolvido um Shell Script e usado o caractere de final de linha do tipo CRLF ocorrerá problemas durante a sua execução, visto que tal padrão não pertence ao padrão POSIX, para contornar isso, deverá ser realizado a sua substituição para o caractere de final de linha do tipo LF.

Verificando se é um problema de carriage return mesmo

Antes de apresentar como isso pode ser resolvido com o comando sed, acho interessante explicar uma maneira simples de saber se o problema que você está enfrentando está relacionado ao final de linha mesmo, para isso, podemos utilizar um dos comandos abaixos e obter a resposta para essa dúvida.

  • Quando for um arquivo pequeno, pode ser utilizado diretamente o comando cat com a sua opção -e, ficando a execução do mesmo conforma abaixo:

      cat -e disk_report.sh
    

    Se for identificado alguma linha terminando com ^M$ é sinal que o problema ou um dos problemas (pode ser que o script contenha outras falhas) apresentados é referente a quebra de linha que está sendo utilizada.

    Como exemplo, o script utilizado foi salvo usando o padrão CRLF e a saída do comando acima foi:

  • Se for um arquivo grande, com muitas linhas, é mais inteligente utilizar uma chamada mais elaborada do que ficar procurando alguma linha que termine com ^M$, para isso, o comando abaixo pode ser utilizado.

      cat -e disk_report.sh | if grep -q '\^M\$'; then echo "Existe ^M$"; fi
    

    Se for encontrado alguma linha problemática, a mensagem Existe ^M$ será retornada.

    Para exemplo, a saída do comando acima no script usado para fins de teste será:

Agora que já sabemos qual final de linha usar ao certo e identificar se algum arquivo possui o final de linha errado, vamos demonstrar utilizando o comando sed como fazer para solucionar esse problema.

Resolvendo o problema com o comando sed

O comando abaixo apresenta uma instrução do comando sed para realizar a substituição no arquivo problemático e assim deixar o mesmo apto a ser executado sem problemas relacionado ao final de linha ^M$

sed -i 's/\r$//' disk_report.sh

A saída do comando acima para o script de exemplo será:

Percebam que após a execução do comando sed o arquivo foi corrigido e as linhas não terminam mais com ^M$ e sim com $

Lembrando que caso você esteja em um diretório com vários arquivos com esse problema, basta utilizar o caractere curinga que o sed irá realizar a substituição desses arquivos com apenas uma chamada.

sed -i 's/\r$//' *.sh

Espero ter ajuda e por hoje é isso.

Abaixo seguem as documentações dos comandos utilizados.

Sucesso a todos!