objectif
Nettoyer des fichiers venant de Windows: convertir les retours chariot CRLF en LF et retirer le BOM UTF-8, en évitant les binaires et en travaillant de manière atomique.
code minimal
# convertir CRLF -> LF pour un fichier (portable via perl)
perl -i -pe 's/\r$//' fichier.txt
utilisation
# 1) convertir un ensemble de fichiers texte (extensions courantes)
ext='sh|py|js|ts|tsx|json|yml|yaml|md|txt|html|css|sql|ini|toml|conf'
find . -type f -regextype posix-extended -regex ".*\.($ext)$" -print0 \
| xargs -0 -n50 perl -i -pe 's/\r$//'
# 2) supprimer un BOM UTF-8 en tête de fichier (si présent)
perl -i -pe 'BEGIN{binmode(STDIN);binmode(STDOUT)} $.==1 && s/^\x{FEFF}//' fichier.txt
# 3) combo: CRLF -> LF + suppression BOM (sur un set de fichiers)
find . -type f -regextype posix-extended -regex ".*\.($ext)$" -print0 \
| xargs -0 -n1 sh -c 'perl -i -pe "s/\r$//" "$1"; perl -i -pe "BEGIN{binmode(STDIN);binmode(STDOUT)} $.==1 && s/^\x{FEFF}//" "$1"' sh
# 4) mode git: ne traiter que les fichiers suivis
git ls-files -z | xargs -0 -n50 perl -i -pe 's/\r$//'
git ls-files -z | xargs -0 -n1 perl -i -pe 'BEGIN{binmode(STDIN);binmode(STDOUT)} $.==1 && s/^\x{FEFF}//'
# 5) vérifier qu'il ne reste plus de CR (retours chariot)
grep -RIl $'\r' . | wc -l
variante(s) utile(s)
# dos2unix si disponible (rapide et simple)
dos2unix -k fichier.txt
find . -type f -name "*.sh" -print0 | xargs -0 dos2unix -k
# GNU sed (Linux) peut faire CRLF -> LF (attention à macOS/BSD)
sed -i.bak 's/\r$//' fichier.txt && rm -f fichier.txt.bak
# supprimer BOM via Python (portable sans perl)
python3 - <<'PY' fichier.txt
import io,sys,os
p=sys.argv[1]
with open(p,'rb') as f: d=f.read()
if d.startswith(b'\xef\xbb\xbf'): d=d[3:]
tmp=p+'.tmp'; open(tmp,'wb').write(d); os.replace(tmp,p)
PY
# pipeline de contrôle: lister les fichiers qui contiennent encore CR ou BOM
# CR:
grep -RIl $'\r' .
# BOM:
grep -RIl $'^\xEF\xBB\xBF' .
notes
-
ciblez uniquement des fichiers texte (par extensions ou via git) pour éviter d’endommager des binaires.
-
perl -i -pe 's/\r$//'fonctionne sur Linux et macOS;sed -ivarie selon les OS. -
ajoutez une politique git pour stabiliser les fins de ligne:
.gitattributes:* text=auto eol=lfgit config core.autocrlf false(côté devs sur data.pm)
-
travaillez de façon atomique pour les conversions massives (voir mktemp + mv si nécessaire) et validez avec
grepavant commit.