Introduction
Lorsque vous travaillez avec des fichiers texte sur des systèmes Linux, vous pouvez rencontrer des problèmes liés à des fins de ligne incohérentes. Ces incohérences surviennent souvent lors du transfert de fichiers entre différents systèmes d'exploitation, comme Windows et Linux.
Dans ce laboratoire, vous découvrirez les caractères de saut de ligne sous Linux et comment les gérer correctement à l'aide d'outils en ligne de commande. Vous comprendrez les différences entre les fins de ligne selon les systèmes d'exploitation et maîtriserez la commande col pour filtrer les sauts de ligne dans les fichiers texte.
Cette compétence fondamentale est essentielle pour les administrateurs système et les développeurs travaillant dans des environnements mixtes, car elle permet de garantir que les fichiers texte sont correctement traités, quelle que soit leur origine.
Comprendre les fins de ligne selon les systèmes d'exploitation
Les différents systèmes d'exploitation utilisent des caractères distincts pour représenter la fin d'une ligne dans les fichiers texte :
- Linux/Unix : utilise le saut de ligne (Line Feed, LF,
\n) - Windows : utilise le retour chariot suivi du saut de ligne (Carriage Return + Line Feed, CRLF,
\r\n) - Mac OS classique : utilise le retour chariot (Carriage Return, CR,
\r)
Lorsque vous travaillez avec des fichiers provenant de systèmes différents, ces variations peuvent entraîner des problèmes de formatage ou un comportement inattendu dans les outils de traitement de texte.
Créons un répertoire pour nos expériences :
mkdir -p ~/project/line_feeds
cd ~/project/line_feeds
Tout d'abord, créons un fichier texte simple avec des fins de ligne de style Unix (LF) :
echo -e "This is line 1.\nThis is line 2.\nThis is line 3." > unix_file.txt
Maintenant, créons un fichier avec des fins de ligne de style Windows (CRLF) :
echo -e "This is line 1.\r\nThis is line 2.\r\nThis is line 3." > windows_file.txt
Pour visualiser la différence entre ces fichiers, nous pouvons utiliser la commande cat avec l'option -v, qui affiche les caractères non imprimables :
cat -v unix_file.txt
Vous devriez obtenir un résultat comme celui-ci :
This is line 1.
This is line 2.
This is line 3.
Vérifions maintenant le fichier de style Windows :
cat -v windows_file.txt
Vous devriez obtenir un résultat comme celui-ci :
This is line 1.^M
This is line 2.^M
This is line 3.
Les caractères ^M représentent les retours chariot (\r) qui font partie des fins de ligne Windows. Ces caractères peuvent causer des problèmes lors du traitement de fichiers sous Linux.
Présentation de la commande col pour le filtrage des sauts de ligne
Linux propose plusieurs outils pour gérer les problèmes de fin de ligne. L'un d'eux est la commande col, principalement conçue pour filtrer les sauts de ligne inversés, mais capable de gérer d'autres caractères spéciaux.
Commençons par comprendre l'utilisation de base de la commande col :
man col | head -20
L'option la plus utile de col pour nos besoins est -b, qui indique à col de supprimer tous les caractères de retour arrière (backspace) ainsi que les caractères qu'ils écrasent. Cela est également utile pour supprimer les caractères de retour chariot (\r) que nous observons dans les fins de ligne de style Windows.
Créons un fichier avec des fins de ligne mixtes pour illustrer cela. Dans le terminal du navigateur LabEx, l'utilisation de printf est plus fiable que la saisie manuelle de caractères de contrôle :
cd ~/project/line_feeds
printf 'This line has Unix endings.\nThis line has Windows endings.\r\nAnother Unix line.\nAnother Windows line.\r\n' > mixed_file.txt
Examinons maintenant ce fichier :
cat -v mixed_file.txt
Vous devriez voir :
This line has Unix endings.
This line has Windows endings.^M
Another Unix line.
Another Windows line.^M
Nous pouvons maintenant utiliser la commande col pour nettoyer ces fins de ligne :
col -b < mixed_file.txt > cleaned_file.txt
Vérifions le résultat :
cat -v cleaned_file.txt
Vous devriez maintenant voir :
This line has Unix endings.
This line has Windows endings.
Another Unix line.
Another Windows line.
Notez que les caractères ^M (retours chariot) ont été supprimés, ne laissant que les sauts de ligne, ce qui constitue le format approprié pour les fichiers texte sous Linux.
Travailler avec des exemples concrets
Appliquons maintenant ce que nous avons appris à des exemples plus réalistes. Les journaux système (logs), les fichiers de configuration et les scripts doivent souvent être traités pour garantir des fins de ligne cohérentes.
Créons un exemple de fichier journal avec des fins de ligne mixtes :
cd ~/project/line_feeds
printf '[2023-05-15 08:00:01] Server started\r\n[2023-05-15 08:05:23] User login: admin\n[2023-05-15 08:10:45] Configuration updated\r\n[2023-05-15 08:15:30] Backup process started\n[2023-05-15 08:30:12] Backup completed\r\n[2023-05-15 09:00:00] Scheduled maintenance started\n' > server_log.txt
Examinons ce fichier :
cat -v server_log.txt
Vous devriez voir les caractères de retour chariot (^M) à la fin de certaines lignes :
[2023-05-15 08:00:01] Server started^M
[2023-05-15 08:05:23] User login: admin
[2023-05-15 08:10:45] Configuration updated^M
[2023-05-15 08:15:30] Backup process started
[2023-05-15 08:30:12] Backup completed^M
[2023-05-15 09:00:00] Scheduled maintenance started
Nettoyons maintenant ce fichier journal :
col -b < server_log.txt > clean_server_log.txt
Vérifiez le résultat :
cat -v clean_server_log.txt
La sortie ne devrait plus contenir de caractères de retour chariot :
[2023-05-15 08:00:01] Server started
[2023-05-15 08:05:23] User login: admin
[2023-05-15 08:10:45] Configuration updated
[2023-05-15 08:15:30] Backup process started
[2023-05-15 08:30:12] Backup completed
[2023-05-15 09:00:00] Scheduled maintenance started
Créons un autre exemple courant : un fichier de script avec des fins de ligne incohérentes. Cette commande conserve les retours chariot dans le contenu du fichier sans dépendre des raccourcis du terminal :
cd ~/project/line_feeds
printf '#!/bin/bash\r\n## This is a sample script\r\necho "Starting script..."\r\nfor i in {1..5}\ndo\r\n echo "Processing item $i"\r\ndone\necho "Script completed."\n' > script.sh
Vérifions ce fichier :
cat -v script.sh
Vous verrez :
#!/bin/bash^M
## This is a sample script^M
echo "Starting script..."^M
for i in {1..5}
do^M
echo "Processing item $i"^M
done
echo "Script completed."
Nettoyons maintenant ce fichier de script :
col -b < script.sh > clean_script.sh
chmod +x clean_script.sh
Vérifiez le résultat :
cat -v clean_script.sh
La sortie devrait maintenant afficher des fins de ligne cohérentes :
#!/bin/bash
## This is a sample script
echo "Starting script..."
for i in {1..5}
do
echo "Processing item $i"
done
echo "Script completed."
Avoir des fins de ligne cohérentes est particulièrement important pour les scripts shell, car des fins de ligne mixtes peuvent provoquer des erreurs d'exécution.
Méthodes alternatives pour gérer les fins de ligne
Bien que la commande col soit utile pour filtrer les sauts de ligne, Linux propose d'autres outils spécifiquement conçus pour convertir les fins de ligne entre différents formats. Explorons quelques-unes de ces alternatives.
Utilisation des commandes dos2unix et unix2dos
Les utilitaires dos2unix et unix2dos sont conçus spécifiquement pour convertir les fichiers texte entre les formats DOS/Windows et Unix.
Tout d'abord, installons ces utilitaires :
sudo apt update
sudo apt install -y dos2unix
Maintenant, créons un autre fichier de style Windows pour tester :
cd ~/project/line_feeds
printf '[General]\r\nUsername=admin\r\nPassword=12345\r\nDebug=true\r\n\n[Network]\r\nHost=127.0.0.1\r\nPort=8080\r\nTimeout=30\r\n' > config.ini
Vérifiez le fichier :
cat -v config.ini
Vous devriez voir les caractères de retour chariot (^M) :
[General]^M
Username=admin^M
Password=12345^M
Debug=true^M
[Network]^M
Host=127.0.0.1^M
Port=8080^M
Timeout=30^M
Utilisons maintenant dos2unix pour convertir ce fichier :
dos2unix config.ini
Cette commande modifie le fichier sur place. Vérifions le résultat :
cat -v config.ini
Les caractères de retour chariot devraient avoir disparu :
[General]
Username=admin
Password=12345
Debug=true
[Network]
Host=127.0.0.1
Port=8080
Timeout=30
Utilisation de la commande tr
Une autre approche consiste à utiliser la commande tr, qui peut traduire ou supprimer des caractères :
cd ~/project/line_feeds
printf 'This is a Windows-style file\r\nwith carriage returns\r\nat the end of each line.\r\n' > tr_example.txt
Vérifiez le fichier :
cat -v tr_example.txt
Vous verrez :
This is a Windows-style file^M
with carriage returns^M
at the end of each line.^M
Utilisez maintenant tr pour supprimer les caractères de retour chariot :
tr -d '\r' < tr_example.txt > tr_cleaned.txt
Vérifiez le résultat :
cat -v tr_cleaned.txt
La sortie devrait être :
This is a Windows-style file
with carriage returns
at the end of each line.
Comparaison des méthodes
Résumons les méthodes que nous avons apprises :
col -b: Efficace pour filtrer les retours chariot et autres caractères spéciaux.dos2unix: Spécifiquement conçu pour convertir les fichiers texte Windows/DOS au format Unix.tr -d '\r': Approche simple utilisant la traduction de caractères.
Chaque méthode a ses avantages :
colest polyvalent et gère divers caractères spéciaux.dos2unixest conçu spécifiquement pour la conversion des fins de ligne.trest une solution simple disponible sur pratiquement tous les systèmes Unix.
Pour la plupart des tâches de conversion de fins de ligne, dos2unix est l'outil le plus direct. Cependant, connaître toutes ces méthodes vous offre une plus grande flexibilité lorsque vous travaillez avec différents systèmes.
Résumé
Dans ce laboratoire, vous avez découvert le filtrage des sauts de ligne sous Linux et comment gérer différents formats de fin de ligne :
Vous avez appris les différentes conventions de fin de ligne utilisées par les systèmes d'exploitation :
- Linux/Unix : Saut de ligne (LF,
\n) - Windows : Retour chariot + Saut de ligne (CRLF,
\r\n) - Mac OS classique : Retour chariot (CR,
\r)
- Linux/Unix : Saut de ligne (LF,
Vous vous êtes exercé à créer et examiner des fichiers avec différentes fins de ligne en utilisant des outils comme
cat -v.Vous avez appris à utiliser la commande
colavec l'option-bpour filtrer les retours chariot et autres caractères spéciaux.Vous avez appliqué ces connaissances à des exemples concrets tels que des fichiers journaux et des scripts shell.
Vous avez exploré des méthodes alternatives pour gérer les fins de ligne, notamment :
- L'utilitaire
dos2unixpour convertir les fichiers texte Windows/DOS au format Unix. - La commande
trpour traduire ou supprimer des caractères spécifiques.
- L'utilitaire
Ces compétences sont essentielles pour les administrateurs système et les développeurs travaillant dans des environnements mixtes où les fichiers peuvent provenir de différents systèmes d'exploitation. Une gestion appropriée des fins de ligne garantit la compatibilité et évite les comportements inattendus lors des tâches de traitement de texte.



