Bon voila, merci pour les commentaires que j'ai récapitulés pour la proposition d'ajout à la FAQ:
-----------------------------------------------------------------------
Windows et Unix ont des caractères de fin de ligne différents. En cas d'import de fichiers texte (y compris des scripts bash par exemple), il faut les convertir au format Unix sans quoi l'interpréteur (/bin/sh ou /bin/bash par exemple) ne pourra pas les exécuter ou risque de mener à des résultats étranges et venus d'ailleurs - je plaisante -, en tous cas, des erreurs difficiles à tracer :
Le fichier au format Windows non converti au format Unix fera apparaitre des caractères ^M si vous l'ouvrez dans un éditeur (vi, vim, nano, gedit, ..).
Remarque: Ce caractère "^M" s'obtient par la combinaison de touches "CTRL-V" + "CTRL-M". Le code ASCII du caractère "^M" est \x0D$.
Voici un panel de solutions possibles :
# commande GNU-sed (SOLUTION PORTABLE)
find /home -type f -name "*.ext" -exec sed -i -e 's/^M$//' {} \;
# commande GNU-sed
find /home -type f -name "*.ext" -exec sed -i -e "s/\x0D$//g" {} \;
# commande SED pour les distributions relativement récentes
find /home -type f -name "*.ext" -exec sed -i -e "s/\r$//g" {} \;
# DOS2UNIX (un simple "apt-get" à mener dans les distros de type Debian)
find /home -type f -name "*.ext" -print0 | while read -r -d "$(printf "\000")" -r path; do dos2unix $path $path"_new"; done
# commande AWK
find /home -type f -name "*.ext" -print0 | while read -r -d "$(printf "\000")" -r path; do awk '{ sub("\r$", ""); print }' $path > $path"_new"; done
# commande TR
find /home -type f -name "*.ext" -print0 | while read -r -d "$(printf "\000")" -r path; do cat $path | tr -d '\r' > $path"_new"; done
# PERL
find /home -type f -name "*.ext" -exec perl -pi -e 's/\r//g' {} \;
Partager