Puedes usar
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
para eliminar la marca de orden de bytes desde el comienzo del archivo, si tiene alguna, así como para convertir cualquier nueva línea CR LF a solo LF. El LANG=C LC_ALL=C
le dice al shell que desea que el comando se ejecute en la configuración regional C predeterminada (también conocida como la configuración regional POSIX predeterminada), donde los tres bytes que forman la marca de orden de bytes se tratan como bytes. La -i
opción de sed significa en el lugar. Si lo usa -i.old
, sed guarda el archivo original como filename.old
y el nuevo archivo (con las modificaciones, si corresponde) como filename
.
Personalmente me gusta tener esto como ~/bin/fix-ms
; por ejemplo, como
#!/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
así que si necesito aplicar esto para decir todos los archivos y encabezados de fuente C (¡mi código anterior de la era MS-DOS, por ejemplo!), simplemente ejecuto
find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
o, si solo quiero ver dicho archivo, sin modificarlo, puedo ejecutar
~/bin/ms-fix < filename | less
y no ver lo feo <U+FEFF>
en mi terminal UTF-8.