Использование awk для удаления метки порядка байтов



как бы awk скрипт (предположительно однострочный) для удаления BOM выглядеть?



спецификация:




  • печатать каждую строку после первой (NR > 1)

  • для первой строки: если он начинается с #FE #FF или #FF #FE, удалите их и распечатайте остальные

653   5  

5 ответов:

попробуйте это:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE

в первой записи (строке) удалите символы спецификации. Распечатайте каждую запись.

или немного короче, используя знание того, что действие по умолчанию в awk заключается в печати записи:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE

1 является самым коротким условием, которое всегда оценивается как true, поэтому каждая запись печатается.

наслаждайтесь!

-- дополнения --

Unicode Byte Order Mark (BOM) FAQ включает в себя следующую таблицу, в которой перечислены точные байты спецификации для каждой кодировки:

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 BFUTF-8 байты спецификации из приведенной выше таблицы.

С помощью 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: the С moreutils:

awk '…' INFILE | sponge INFILE

не awk, но проще:

tail -c +4 UTF8 > UTF8.nobom

для проверки спецификации:

hd -n 3 UTF8

Если BOM присутствует вы увидите:00000000 ef bb bf ...

в дополнение к преобразованию окончаний строк CRLF в LF,dos2unix также удаляет спецификации:

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-challenged (на windows, с пользовательским интерфейсом).
Я столкнулся с той же проблемой в проекте WordPress (BOM вызывал проблемы с RSS-каналом и проверкой страницы), и мне пришлось заглянуть во все файлы в довольно большом дереве каталогов, чтобы найти тот, который был с BOM. Нашел приложение под названием Заменить Pioneer а это:

Batch Runner -> поиск (чтобы найти все файлы в подпапках) - > заменить шаблон - > Binary remove BOM (для этого есть готовый поиск и замена шаблона).

Это не самое элегантное решение и требуют установки программы, что является недостатком. Но как только я узнал, что происходит вокруг меня, это сработало как шарм (и нашел 3 файла из примерно 2300, которые были с BOM).

Comments

    Ничего не найдено.