Intermédiaire 8 min de lecture 25 janvier 2025

LF vs CRLF : différences, impacts et solutions pratiques

Tout fonctionne en local, mais vos tests cassent, votre diff explose ou votre script shell renvoie $'\r': command not found. Très souvent, la cause vient d'un mélange de fins de ligne. LF et CRLF ne se voient pas, mais ils changent tout. Voici ce qu'ils sont, pourquoi ils posent problème et comment les maîtriser.

Qu'est-ce que LF et CRLF ?

Les fins de ligne indiquent où une ligne de texte se termine. Selon le système, elles sont encodées avec LF (Unix/macOS) ou CRLF (Windows).

Les principales catégories à connaître :

1 Séparateurs de lignes ASCII classiques

Les encodages de fin de ligne les plus courants.

CR (13, \r), LF (10, \n), CRLF (\r\n)

2 Caractères de contrôle liés aux fins de ligne

Certains contrôles ASCII influencent les retours à la ligne.

CR (13), LF (10), FF (12), VT (11)

3 Séparateurs et fins de ligne Unicode

Moins fréquents mais source d'écarts selon les parseurs :

NEL (U+0085) - Next Line
LS (U+2028) - Line Separator
PS (U+2029) - Paragraph Separator
CRLF (U+000D U+000A) - Paire classique Windows

4 Marques techniques

Éléments qui compliquent la détection ou la conversion :

BOM (U+FEFF) - Byte Order Mark
^M - Carriage Return visible dans cat -A
Fin de fichier sans newline - no newline at end of file

Problèmes classiques

Mélange LF/CRLF dans le dépôt

Git montre des diffs géants sur chaque ligne à cause d'une normalisation incohérente.

Scripts et jobs CI qui plantent

bash affiche $'\r': command not found quand des CR sont présents sous Unix.

Trim() ou strip() inefficace

Ces fonctions ne normalisent pas automatiquement les fins de ligne (CR vs LF).

Regex et parseurs incomplets

Certaines expressions ou libs ne prennent en compte que \n et ignorent \r\n.

Exemple de problème courant :

# Deux chaînes identiques à l'œil, fins de ligne différentes
string1 = "a\nb"
string2 = "a\r\nb" # CRLF
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git montre que toutes les lignes ont changé (LF ↔ CRLF)
!
Un script bash renvoie $'\r': command not found
!
Vos commits alternent entre "CRLF to LF" et "LF to CRLF"
!
Des fichiers CSV importent des lignes vides ou collées
!
L'indicateur EOL de l'éditeur bascule entre LF et CRLF sans raison

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII détecte et met en évidence le style de fin de ligne de vos textes (LF, CRLF, CR), repère les mélanges dans un même fichier et facilite la conversion cohérente.

✅ Détection automatique

LF, CRLF, CR, NEL, LS/PS

📊 Analyse complète

Positions, comptage par type, sections problématiques

🧹 Nettoyage automatique

Normalisation CRLF ↔ LF en un clic

💾 Export propre

Téléchargement du texte normalisé prêt à commiter

Autres méthodes de détection

Affichage dans l'éditeur

Activez l'affichage des fins de ligne (LF/CRLF) et la règle "End of Line"
Paramétrez .editorconfig pour imposer end_of_line = lf

En ligne de commande (Unix)

# Repérer les CR (carriage return) dans les fichiers
grep -n $'\r' -H fichier.txt
# Visualiser clairement les fins de ligne
sed -n l fichier.txt
# Afficher ^M et les marqueurs de fin de ligne
cat -A fichier.txt
# Inspecter les octets pour confirmer \r\n vs \n
hexdump -C fichier.txt

En code

JavaScript

str.replace(/\r\n?/g, '\n')

Python

s.replace('\r\n', '\n').replace('\r', '\n')

Excel / Google Sheets

SUBSTITUTE(cellule;CHAR(13)&CHAR(10);CHAR(10))

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant de bricoler des scripts, utilisez Clean ASCII pour détecter et normaliser instantanément vos fins de ligne :

Détection automatique
Normalisation LF/CRLF
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Imposez LF via .gitattributes et .editorconfig (end_of_line = lf)
Configurez Git (core.autocrlf=false) pour éviter les conversions implicites
Convertissez les fichiers existants (dos2unix/unix2dos) et uniformisez

🧹 Filtrer

Écrivez des fonctions eol_normalize() pour remplacer CRLF/CR par LF
Définissez l'EOL lors des lectures/écritures de fichiers
Bloquez les CR isolés sauf cas explicitement nécessaires

⚙️ Automatiser

Hooks pre-commit pour refuser les fichiers avec CRLF non autorisés
Tests qui valident le style EOL des fichiers critiques
Linting en CI pour forcer une normalisation stable

Checklist rapide

Fichiers en UTF-8 sans BOM
Fins de ligne uniformes via gitattributes
Outil affichant les fins de ligne et caractères de contrôle
Fonction de normalisation des EOL dans vos libs
Tests vérifiant l'absence de CRLF/CR indésirables
Documentation développeurs sur la politique EOL et Git

Conclusion

LF vs CRLF paraît anodin, pourtant les impacts sont réels. En contrôlant vos fins de ligne, vous évitez des heures de debug et des diffs inutiles.

Détectez systématiquement, normalisez vos fichiers et stabilisez votre chaîne d’outils pour éliminer 80% des soucis liés aux fins de ligne.

Analysez et normalisez vos fins de ligne

Utilisez notre outil pour repérer et corriger les mélanges LF/CRLF dans vos fichiers.

Analyser mon texte