Puoi usare
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
per rimuovere il contrassegno dell'ordine dei byte dall'inizio del file, se presente, e convertire qualsiasi nuova riga CR LF in LF. La LANG=C LC_ALL=C
racconta il guscio si desidera che il comando venga eseguito nel locale di default C (noto anche come l'impostazione internazionale predefinita POSIX), dove i tre byte che costituiscono il Byte Order Mark vengono considerati byte. L' -i
opzione di sed significa sul posto. Se lo usi -i.old
, sed salva il file originale come filename.old
e il nuovo file (con le eventuali modifiche) come filename
.
Personalmente mi piace avere questo come ~/bin/fix-ms
; per esempio, come
#!/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
quindi se devo applicare questo per dire tutti i file sorgente e le intestazioni C (il mio vecchio codice dell'era MS-DOS, per esempio!), ho appena eseguito
find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
o, se voglio solo guardare un tale file, senza modificarlo, posso eseguire
~/bin/ms-fix < filename | less
e non vedere il brutto <U+FEFF>
nel mio terminale UTF-8.