Вы можете использовать
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
удалить метку порядка следования байтов из начала файла, если он есть, а также преобразовать любые символы новой строки CR LF только в LF. Он LANG=C LC_ALL=C
сообщает оболочке, что вы хотите, чтобы команда выполнялась в локали C по умолчанию (также известной как локаль POSIX по умолчанию), где три байта, образующие метку порядка байтов, обрабатываются как байты. -i
Вариант СЭД означает на месте. Если вы используете -i.old
, то sed сохраняет исходный файл как filename.old
, а новый файл (с изменениями, если есть) как filename
.
Мне лично нравится иметь это как ~/bin/fix-ms
; например, как
#!/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
так что, если мне нужно применить это, чтобы сказать все исходные файлы и заголовки C (мой старый код из эры MS-DOS, например!), я просто запускаю
find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
или, если я просто хочу посмотреть на такой файл, не изменяя его, я могу запустить
~/bin/ms-fix < filename | less
и не вижу уродливого <U+FEFF>
в моем терминале UTF-8.