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 ... 
  • копировать имена файлов со специальными символами на внешний том ntfs
  • Преобразование текстовых файлов с ASCII в Unicode без какой-либо команды
  • Консоль Linux не может отображать какой-либо язык, кроме английского, в то время как терминал под Gnome может
  • Linux, альтернативный кодам ALT + numpad
  • Символы, отличные от ASCII, некорректно сохраненные при отправке почты в Emacs
  • Может ли vim отображать только символы ASCII и обрабатывать другие байты как двоичные данные?
  • Печать текста UTF-8 (включая китайский)
  • Монетный двор 17 (Корица): CTRL + Shift + U, не позволяющий вводить символы Юникода
  • coreutils, которые знают utf?
  • Почему xxd не показывает знак порядка байтов?
  • Как найти, какой шрифт предоставляет определенный символ Unicode?
  • Linux и Unix - лучшая ОС в мире.