← retour aux snippets

normaliser fins de ligne crlf vers lf

Convertir CRLF en LF et supprimer le BOM UTF-8 de façon portable, en masse et sans casser les binaires.


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 -i varie selon les OS.

  • ajoutez une politique git pour stabiliser les fins de ligne:

    • .gitattributes: * text=auto eol=lf
    • git 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 grep avant commit.