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

StackOverflow https://stackoverflow.com/questions/1068650

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

  • выведите каждую строку после первой (NR > 1)
  • для первой строки:Если это начинается с #FE #FF или #FF #FE, удалите их и распечатайте остальные
Это было полезно?

Решение

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

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

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

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

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

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

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

-- ДОБАВЛЕНИЕ --

Часто задаваемые вопросы о метке порядка байтов в Юникоде (спецификация) включает следующую таблицу, в которой перечислены точные байты спецификации для каждой кодировки:

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

Другие советы

Использование 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 в документации не упоминается поддержка шестнадцатеричного экранирующего ala \xef.

Аналогичный трюк может быть достигнут с любой программой путем подключения к sponge инструмент из дополнительные материалы:

awk '…' INFILE | sponge INFILE

Не awk, а проще:

tail -c +4 UTF8 > UTF8.nobom

Для проверки наличия спецификации:

hd -n 3 UTF8

Если спецификация присутствует, вы увидите: 00000000 ef bb bf ...

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

dos2unix *.txt

dos2unix также преобразует файлы UTF-16 со спецификацией (но не файлы UTF-16 без спецификации) в UTF-8 без спецификации:

$ 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 (спецификация вызывала проблемы с rss-каналом и проверкой страницы), и мне пришлось просмотреть все файлы в довольно большом дереве каталогов, чтобы найти тот, который был в спецификации.Найдено приложение под названием Заменить Пионера и в нем:

Пакетный запуск -> Поиск (чтобы найти все файлы во вложенных папках) -> Заменить шаблон -> Удалить бинарную спецификацию (для этого есть готовый шаблон поиска и замены).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top