AWK с спецификацией: Есть ли классный способ обработки спецификации Unicode с регулярным выражением?

У меня есть два файла, закодированных в UTF-8 с / без спецификации:

/tmp/bom$ ls list.bom.txt list.nobom.txt /tmp/bom$ cat list.nobom.txt apple banana avocado 寿司 melon /tmp/bom$ diff list.nobom.txt list.bom.txt 1c1 < apple --- > apple /tmp/bom$ file list.nobom.txt list.bom.txt list.nobom.txt: UTF-8 Unicode text list.bom.txt: UTF-8 Unicode (with BOM) text 

Единственным отличием между двумя файлами является заголовок BOM EF BB BF .

Затем, чтобы отфильтровать строки, начинающиеся с «a», я пишу короткий скрипт awk с помощью каретки.

 /tmp/bom$ gawk '/^a.*/' list.nobom.txt apple avocado /tmp/bom$ gawk '/^a.*/' list.bom.txt avocado 

К сожалению, при спецификации заголовка apple в первой строке игнорируется.

Поэтому мой вопрос: есть ли способ справиться с этим?

Я рассматриваю три решения:

  1. Записывайте байты спецификации напрямую. Например,

     gawk 'BEGIN { pat = "^(\xef\xbb\xbf)?a.*" } $0 ~ pat { print }' 

    работает в UTF-8. Однако это не относится к другим кодировкам. Более того, если U + FEFF используется как безразрушающее пространство с нулевой шириной (см. Комментарии), приведенный выше сценарий в некоторых случаях терпит неудачу.

  2. Удалите байты спецификации путем повторного кодирования с помощью nkf . Например,

     nkf --oc=UTF-8 list.bom.txt | gawk '/^a.*/' 

    работает. Однако мне интересно, есть ли более сложный способ.

  3. [ADDED] Это улучшение первого, используя функцию bash.

     gawk -v bom="$(echo -e '\uFEFF')" ' NR == 1 { pat = "^" bom; sub(pat, "") } /^a.*/ { print } ' 

    Это работает как для UTF-8 с / без спецификации. Однако это не работает для UTF-16 в моей среде. Итак, второе решение лучше.

Более того, я думаю, что это также проблема для grep , sed или других скриптов с использованием регулярного выражения. Итак, если будет общее решение, это будет более оценено.

One Solution collect form web for “AWK с спецификацией: Есть ли классный способ обработки спецификации Unicode с регулярным выражением?”

Спецификация не имеет смысла в UTF-8. Они обычно добавляются по ошибке поддельным программным обеспечением в ОС Microsoft.

dos2unix удалит его, а также позаботится о других особенностях текстовых файлов Windows.

 dos2unix < file.win.txt | awk ... 
  • Как я могу заставить TTY использовать соответствующую кодировку?
  • Управление символами unicode libvte
  • Символы, отличные от ASCII, некорректно сохраненные при отправке почты в Emacs
  • Комбинация клавиш для вставки символов без клавиатуры
  • Как печатать имена символа Unicode для строки ввода?
  • проблема редактирования utf8 текстовый файл с vim
  • Не-ASCII печатные символы в sshd-баннере
  • Unicode emoji не отображается в подсказке tcsh
  • Как преобразовать файлы txt UTF-8 во все прописные буквы в bash?
  • Граница Tmux разделена на rxvt
  • В chrooted env команда ls показывает «?» Вместо символов UTF8
  • Interesting Posts

    Может ли gnome просмотрщик изображений (eog) масштабировать и панорамировать с помощью клавиатуры? Любые альтернативы, которые могут?

    альтернативы обновления только для одного пользователя

    Как передать полученные данные из netcat в другой скрипт в качестве аргумента?

    winbind с использованием неправильного кода сервиса netbios в запросах

    Как добавить систему SLED 11 в домен Windows

    Как работает механизм set-user-ID в Unix?

    как установить Debian на компьютер с Windows 10 (uefi)?

    Почему рабочий стол Lumina не загружается?

    Как получить хешированный пароль в / etc / shadow с помощью getpwnam ()?

    Sed Замените числовое содержимое

    Как показать имя хоста в командной строке командной строки Linux

    Неудачное решение от «Как перенаправить stdout и stderr в файл и отобразить stderr для консоли»

    Выбор файловой системы кластера для чтения / записи большого количества небольших файлов

    перенаправление портов на внутренний LAN-сервер

    Настройка wifi-конфигураций для Broadcom43142

    Linux и Unix - лучшая ОС в мире.