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!