Comment déterminer la fin de ligne d'un fichier
-
02-07-2019 - |
Question
J'ai un tas (des centaines) de fichiers qui sont supposés avoir des fins de ligne Unix. Je soupçonne fortement que certains d’entre eux ont une fin de ligne Windows, et je veux déterminer par programme ceux qui en ont.
Je sais que je peux simplement exécuter
flip -uou quelque chose de similaire dans un script pour tout convertir, mais je veux pouvoir identifier les fichiers qui doivent d'abord être modifiés.
La solution
Vous pouvez utiliser grep
egrep -l \r'\$ *
Autres conseils
Vous pouvez utiliser l'outil fichier
, qui vous dira le type de fin de ligne. Vous pouvez également utiliser dos2unix -U
, qui convertira tout le texte en fins de ligne Unix, quel que soit le début.
Quelque chose dans le sens de:
perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME
bien que certaines de ces expressions rationnelles aient besoin d'être peaufinées et rangées.
Cela produira votre fichier avec WIN, MAC ou UNIX à la fin de chaque ligne. Bon si votre fichier est en quelque sorte un gâchis épouvantable (ou un diff) et qu’il a plusieurs extrémités.
Voici la réponse la plus sûre. Stimms answer ne prend pas en compte les sous-répertoires et les fichiers binaires
find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
- Utilisez
fichier
pour rechercher le type de fichier. Ceux avec CRLF ont des caractères de retour de fenêtres. La sortie dufichier
est délimitée par un:
, et le premier champ est le chemin du fichier.
Unix utilise un octet, 0x0A (LineFeed), tandis que Windows utilise deux octets, 0x0D 0x0A (retour chariot, saut de ligne).
Si vous ne voyez jamais un 0x0D, c'est très probablement Unix. Si vous voyez des paires 0x0D 0x0A, il est fort probable que MSDOS.
Windows utilise le caractère 13 & amp; 10 pour la fin de ligne, unix seulement l'un d'entre eux (je ne me souviens plus lequel). Vous pouvez donc remplacer le caractère 13 & amp; 10 pour le caractère 13 ou 10 (celui qui utilise unix).
Lorsque vous savez quels fichiers ont des fins de ligne Windows ( 0x0D 0x0A
ou \ r \ n
), que ferez-vous avec ces fichiers? Je suppose que vous allez les convertir en fins de lignes Unix ( 0x0A
ou \ n
). Vous pouvez convertir un fichier avec des fins de ligne Windows en fins de ligne Unix avec l'utilitaire sed
. Il vous suffit d'utiliser la commande suivante:
#!/bin/bash
function travers()
{
for file in $(ls); do
if [ -f "${file}" ]; then
sed -i 's/\r//' "${file}"
elif [ -d "${file}" ]; then
cd "${file}"
travers
cd ..
fi
done
}
travers
gt; sed -i 's/\r//' my_file_with_win_line_endings.txt
Vous pouvez le mettre dans un script comme ceci:
<*>Si vous l'exécutez à partir de votre répertoire racine avec des fichiers, vous serez sûr que tous les fichiers sont terminés par Unix.