Vous pouvez utiliser
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
pour supprimer la marque d'ordre des octets au début du fichier, le cas échéant, ainsi que pour convertir les nouvelles lignes CR LF en LF uniquement. Il LANG=C LC_ALL=C
indique au shell que la commande doit être exécutée dans les paramètres régionaux C par défaut (également appelés paramètres régionaux POSIX par défaut), où les trois octets formant la marque d'ordre d'octet sont traités comme des octets. L' -i
option de sed signifie in-situ. Si vous utilisez -i.old
, sed enregistre le fichier d'origine sous filename.old
le nouveau fichier (avec les modifications éventuelles) sous filename
.
Je tiens personnellement à avoir cela comme ~/bin/fix-ms
; par exemple, comme
#!/bin/dash
export LANG=C LC_ALL=C
if [ $# -gt 0 ]; then
for FILE in "$@" ; do
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$FILE" || exit 1
done
else
exec sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//'
fi
de sorte que si j’ai besoin d’appliquer ceci pour dire tous les fichiers sources C et tous les en-têtes (mon ancien code de l’ère MS-DOS, par exemple!), je ne fais que lancer
find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
ou, si je veux juste regarder un tel fichier, sans le modifier, je peux courir
~/bin/ms-fix < filename | less
et pas voir le laid <U+FEFF>
dans mon terminal UTF-8.