У мене є файл кодування UTF-8 з BOM і хочу видалити BOM. Чи є інструменти командного рядка Linux для видалення BOM з файлу?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
У мене є файл кодування UTF-8 з BOM і хочу видалити BOM. Чи є інструменти командного рядка Linux для видалення BOM з файлу?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
Відповіді:
Якщо ви не впевнені, чи файл містить BOM UTF-8, тоді це (якщо припустити реалізацію GNU sed
) видалить BOM, якщо він існує, або не внесе жодних змін, якщо він не буде.
sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt
Ви також можете перезаписати наявний файл за допомогою -i
параметра:
sed -i '1s/^\xEF\xBB\xBF//' orig.txt
en_US.UTF-8
локальним і він працював. Коли це не вдасться?
-<U+FEFF>\chapter{xxx}
Після: +\chapter{xxx}^M
Пояснення: Використання MS-word для друку в латекс-файлі. Латекс під Linux показує згадані помилки. Вихід - із системи git. Як я міг змінити вираз, щоб уникнути і цього особливого випадку?
BOM не має сенсу в UTF-8. Вони, як правило, додаються помилково зловмисним програмним забезпеченням на ОС Microsoft.
dos2unix
видалить його, а також подбає про інші ідіосинкразії текстових файлів Windows.
dos2unix test.xml
dos2unix
?
Можна видалити BOM з файлу tail
командою:
tail -c +4 withBOM.txt > withoutBOM.txt
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:
vi text.xml
Видалити кодування BOM:
:set nobomb
Збережіть і вийдіть:
:wq
<feff>
, але :set nobomb
не змінює і не видаляє його.
Можна використовувати
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 локаллю за замовчуванням), де три байта , що утворюють Byte Order Mark обробляється як кількість байтів. -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.
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
?
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
не робить; він повертає код виходу, але він обробляє всі файли, перелічені в списку аргументів, перш ніж виходити.
--
перш ніж ім'я файлів (файлів): без нього імена файлів, що починаються з тире, можуть вважатися варіантами sed. Я змінив їх у свою відповідь; дякую за нагадування!
Нещодавно я знайшов цей крихітний інструмент командного рядка, який додає або видаляє BOM у довільних файлах, кодованих UTF-8: UTF BOM Utils ( нове посилання на github)
Невеликий недолік, ви можете завантажити лише звичайний вихідний код C ++. Ви повинні створити makefile (наприклад, із CMake ) та скласти його самостійно, бінарні файли на цій сторінці не надаються.