У меня есть файл в кодировке UTF-8 с BOM и я хочу удалить BOM. Существуют ли какие-либо инструменты командной строки Linux для удаления спецификации из файла?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
command-line
files
unicode
m13r
источник
источник
Ответы:
Если вы не уверены, содержит ли файл спецификацию UTF-8, то это (при условии реализации GNU
sed
) удалит спецификацию, если она существует, или не внесет никаких изменений, если ее нет.Вы также можете перезаписать существующий файл с помощью
-i
опции:источник
en_US.UTF-8
и это сработало. Когда это не удастся?1s/
означает поиск только по первой строке; другие линии не затрагиваются. Эти^
средства соответствуют только в начале (первой) линии.\xEF\xBB\xBF
является спецификацией UTF-8 (экранированная шестнадцатеричная строка).//
значит заменить ничем. Я мог бы добавить1
в конец (для1s/^xEF\xBB\xBF//1
), что будет означать только совпадение с первым появлением шаблона на линии. Но так как поиск привязан^
, это не будет иметь никакого значения. Если файл не имеет спецификации в начале первой строки, шаблон не будет соответствовать, и, следовательно, никаких изменений не произойдет.Спецификация не имеет смысла в UTF-8. Как правило, они ошибочно добавляются фиктивным программным обеспечением на ОС Microsoft.
dos2unix
удалит его, а также позаботится о других особенностях текстовых файлов Windows.источник
dos2unix
?Удалить спецификацию из файла можно
tail
командой:источник
tail
использует 1 на основе индексации ?! WTF!tail -c -1
илиtail -c 1
(для чегоtail
обычно используется) - это содержимое, начинающееся с последнего байта,tail -c +1
начиная с первого байта.tail -c 0
/tail -c +0
для этого было бы намного более неинтуитивным.(dd bs=1 count=3 of=/dev/null; cat) <input >output
. Или с GNU(head -c3 >/dev/null; cat)
- даже в UTF8 или другой не однобайтовой локали; Глава GNU делает 'char' = байт.Использование VIM
Открыть файл в VIM:
Удалить кодировку спецификации:
Сохранить и выйти:
источник
<feff>
, но:set nobomb
не изменяет и не удаляет его.Вы можете использовать
удалить метку порядка следования байтов из начала файла, если он есть, а также преобразовать любые символы новой строки CR LF только в LF. Он
LANG=C LC_ALL=C
сообщает оболочке, что вы хотите, чтобы команда выполнялась в локали C по умолчанию (также известной как локаль POSIX по умолчанию), где три байта, образующие метку порядка байтов, обрабатываются как байты.-i
Вариант СЭД означает на месте. Если вы используете-i.old
, то sed сохраняет исходный файл какfilename.old
, а новый файл (с изменениями, если есть) какfilename
.Мне лично нравится иметь это как
~/bin/fix-ms
; например, кактак что, если мне нужно применить это, чтобы сказать все исходные файлы и заголовки C (мой старый код из эры MS-DOS, например!), я просто запускаю
или, если я просто хочу посмотреть на такой файл, не изменяя его, я могу запустить
и не вижу уродливого
<U+FEFF>
в моем терминале UTF-8.источник
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
?sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
не помогает; он возвращает код завершения, но обрабатывает все файлы, перечисленные в списке аргументов, перед выходом.--
Перед именем файла (ов), конечно же, важны имена: без него имена файлов, начинающиеся с тире, могут считаться опциями sed. Я отредактировал их в своем ответе; Спасибо за напоминание!Недавно я обнаружил этот крошечный инструмент командной строки, который добавляет или удаляет спецификацию для произвольных файлов в кодировке UTF-8: UTF BOM Utils ( новая ссылка на github)
Небольшой недостаток, вы можете скачать только простой исходный код C ++. Вы должны создать make-файл (например, с CMake ) и скомпилировать его самостоятельно, двоичные файлы на этой странице не предоставляются.
источник