Как бы awk
выглядеть сценарий (предположительно однострочный) для удаления спецификации ?
Технические характеристики:
- печатать каждую строку после первой (
NR > 1
) - для первой строки: если она начинается с
#FE #FF
или#FF #FE
, удалите их и распечатайте остальные
unicode
awk
byte-order-mark
Болдевин
источник
источник
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILE
и убедитесь, что INFILE и OUTFILE разные!perl -i.orig -pe 's/^\x{FFFE}//' badfile
вы можете полагаться на свои переменные PERL_UNICODE и / или PERLIO для кодирования. PERL_UNICODE = SD будет работать с UTF-8; для остальных вам понадобится PERLIO.awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'
Используя GNU
sed
(в Linux или Cygwin):На FreeBSD:
Преимущество использования GNU или FreeBSD
sed
:-i
параметр означает «на месте» и будет обновлять файлы без необходимости перенаправления или странных уловок.На Mac:
Это
awk
решение в другом ответе работает , но приведеннаяsed
выше команда не работает. По крайней мере, в документации Mac (Sierra)sed
не упоминается поддержка шестнадцатеричного экранирования ala\xef
.Подобного трюка можно достичь с помощью любой программы, подключив
sponge
инструмент к инструменту из moreutils :источник
10.11.6
это не работает, но официальный ответ stackoverflow.com/a/1068700/9636 работает нормально.Не на awk, а попроще:
Чтобы проверить спецификацию:
Если есть спецификация, вы увидите:
00000000 ef bb bf ...
источник
cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8
сломается. Никогда не используйте спецификацию в UTF-8. Период.hd
не доступна на OS X (по состоянию на 10.8.2), поэтому проверить для UTF-8 BOM там вы можете использовать следующее:head -c 3 file | od -t x1
.Помимо преобразования окончаний строк CRLF в LF,
dos2unix
также удаляются спецификации:dos2unix
также конвертирует файлы UTF-16 с спецификацией (но не файлы UTF-16 без спецификации) в UTF-8 без спецификации:источник
Я знаю, что вопрос был направлен на unix / linux, подумал, что стоит упомянуть хороший вариант для unix-проблемных (в Windows с пользовательским интерфейсом).
Я столкнулся с той же проблемой в проекте WordPress (спецификация вызывала проблемы с RSS-потоком и проверкой страницы), и мне пришлось просмотреть все файлы в довольно большом дереве каталогов, чтобы найти тот, который был с спецификацией. Нашел приложение под названием Replace Pioneer и в нем:
Batch Runner -> Search (чтобы найти все файлы в подпапках) -> Replace Template -> Binary remove BOM (для этого есть готовый шаблон поиска и замены).
Это было не самое элегантное решение и требовало установки программы, что является недостатком. Но как только я узнал, что происходит вокруг меня, это сработало как шарм (и нашел 3 файла из примерно 2300, которые были с спецификацией).
источник