Відповіді:
Спробуйте це:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
На першому записі (рядку) видаліть символи BOM. Роздрукувати кожен запис.
Або трохи коротше, використовуючи знання, що типовою дією в awk є друк запису:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
це найкоротша умова, яка завжди оцінюється як істинна, тому кожен запис друкується.
Насолоджуйтесь!
- ДОБАВЛЕННЯ -
Поширені запитання щодо запиту порядку замовлення Unicode Byte (BOM) містять таку таблицю, в якій перераховані точні байти BOM для кожного кодування:
Bytes | Encoding Form
--------------------------------------
00 00 FE FF | UTF-32, big-endian
FF FE 00 00 | UTF-32, little-endian
FE FF | UTF-16, big-endian
FF FE | UTF-16, little-endian
EF BB BF | UTF-8
Таким чином, ви можете бачити, як \xef\xbb\xbf
відповідає EF BB BF
UTF-8
байт BOM з наведеної таблиці.
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILE
і переконайтеся, що INFILE та OUTFILE різні!
perl -i.orig -pe 's/^\x{FFFE}//' badfile
ви можете розраховувати на свої PERL_UNICODE та / або PERLIO envariables для кодування. PERL_UNICODE = SD буде працювати для UTF-8; для інших вам знадобиться PERLIO.
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'
Використання GNU sed
(на Linux або Cygwin):
# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt
На FreeBSD:
sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt
Перевага використання GNU або FreeBSD sed
: -i
параметр означає "на місці" і оновлюватиме файли без необхідності перенаправлення чи дивних хитрощів.
На Mac:
Це awk
рішення в іншій відповіді працює , але sed
команда вище не працює. Принаймні, в документації на Mac (Sierra) sed
не йдеться про підтримку шістнадцяткової втечі ала \xef
.
Подібного трюку можна досягти з будь-якою програмою, перейшовши на sponge
інструмент від moreutils :
awk '…' INFILE | sponge INFILE
10.11.6
це не працює, але офіційна відповідь stackoverflow.com/a/1068700/9636 працює чудово.
Не диво, але простіше:
tail -c +4 UTF8 > UTF8.nobom
Щоб перевірити наявність BOM:
hd -n 3 UTF8
Якщо BOM присутній, ви побачите: 00000000 ef bb bf ...
cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8
зламаються. Ніколи не використовуйте BOM на UTF-8. Період.
hd
не доступна на OS X (станом на 10.8.2), тому перевірити для UTF-8 BOM там ви можете використовувати наступне: head -c 3 file | od -t x1
.
На додаток до перетворення закінчень рядків CRLF у LF, dos2unix
також видаляються BOM:
dos2unix *.txt
dos2unix
також перетворює файли UTF-16 з BOM (але не файли UTF-16 без BOM) в UTF-8 без BOM:
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16be>bom-utf16be
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16le>bom-utf16le
$ printf '\ufeffä\n'>bom-utf8
$ printf 'ä\n'|iconv -f utf-8 -t utf-16be>utf16be
$ printf 'ä\n'|iconv -f utf-8 -t utf-16le>utf16le
$ printf 'ä\n'>utf8
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be feff00e4000a
bom-utf16le fffee4000a00
bom-utf8 efbbbfc3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
$ dos2unix -q *
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be c3a40a
bom-utf16le c3a40a
bom-utf8 c3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
Я знаю, що питання було спрямоване на unix / linux, я вважав, що варто згадати хороший варіант для викликів, які викликали unix (для Windows, з інтерфейсом користувача).
Я зіткнувся з тією ж проблемою в проекті WordPress (BOM викликав проблеми з RSS-стрічкою та валідацією сторінок), і мені довелося вивчити всі файли у досить великому дереві каталогів, щоб знайти той, який був у BOM. Знайдено додаток під назвою Замінити піонер і в ньому:
Batch Runner -> Пошук (щоб знайти всі файли у підпапках) -> Замінити шаблон -> Бінарне видалення BOM (для цього є готовий шаблон пошуку та заміни).
Це не було найелегантнішим рішенням, і для цього потрібна була встановити програму, що є і недоліком. Але як тільки я дізнався, що відбувається навколо мене, це спрацювало як шарм (і знайшов 3 файли з приблизно 2300, які були з BOM).