Você pode usar
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
para remover a marca de ordem de bytes do início do arquivo, se houver, e converter qualquer nova linha de CR LF em LF apenas. O LANG=C LC_ALL=C
comando diz ao shell que você deseja que o comando seja executado no código de idioma C padrão (também conhecido como código de idioma POSIX padrão), onde os três bytes que formam a Marca de Ordem de Byte são tratados como bytes. A -i
opção para sed significa no local. Se você usar -i.old
, o sed salva o arquivo original como filename.old
e o novo arquivo (com as modificações, se houver) como filename
.
Eu pessoalmente gosto de ter isso como ~/bin/fix-ms
; por exemplo, 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
para que, se eu precisar aplicar isso para dizer todos os arquivos e cabeçalhos de origem C (meu código antigo da era do MS-DOS, por exemplo!), eu apenas corro
find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
ou, se eu quiser apenas ver um arquivo desse tipo, sem modificá-lo, posso executar
~/bin/ms-fix < filename | less
e não ver o feio <U+FEFF>
no meu terminal UTF-8.