grep для Emojis в Linux - PullRequest
       27

grep для Emojis в Linux

0 голосов
/ 11 сентября 2018

Я пытаюсь просмотреть список токенов, который содержит несколько не-ASCII символов.Я хочу соответствовать только смайликам, другие символы, такие как ð или ñ, в порядке.Диапазон юникода для смайликов выглядит как U + 1F600-U + 1F1FF, но когда я ищу его с помощью grep, это происходит:

grep -P "[\x1F6-\x1F1]" contact_names.tokens                                                                                                                                                                                                                                
grep: range out of order in character class 

https://unicode.org/emoji/charts/full-emoji-list.html#1f3f4_e0067_e0062_e0077_e006c_e0073_e007f

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Вы можете использовать ugrep в качестве замены для grep, чтобы сделать это:

ugrep "[\x{1F1FF}-\x{1F600}]" contact_names.tokens  

ugrep соответствует шаблонам Unicode по умолчанию (отключено с опцией -U). Синтаксис регулярного выражения соответствует POSIX ERE и расширен Классы символов Unicode, ленивые квантификаторы и негативные шаблоны для пропустите нежелательные совпадения с образцом, чтобы получить более точные результаты.

ugrep выполняет поиск в кодировке UTF, когда UTF BOM (метка порядка байтов) присутствует и ASCII и UTF-8, когда нет спецификации UTF. вариант --encoding позволяет искать многие другие форматы файлов, такие как ISO-8859-1, EBCDIC и кодовые страницы 437, 850, 858, 1250–1258.

ugrep ищет текстовые и двоичные файлы и создает hexdumps для двоичных совпадений.

Диапазоны Юникода для смайликов больше, чем диапазон от 1F1FF + U до 1F600 + U. См. Официальную публикацию Unicode 12 https://unicode.org/emoji/charts-12.0/full-emoji-list.html

0 голосов
/ 29 июня 2019

Необходимо указать кодовые точки с полным значением (не 1F6, а 1F600) и обернуть их фигурными скобками. Кроме того, первое значение должно быть меньше, чем последнее значение. Таким образом, регулярное выражение должно быть "[\x{1F1FF}-\x{1F600}]".

Диапазон юникода для смайликов, однако, более сложный, чем вы предполагали. Страница, на которую вы ссылались, не сортирует символы по кодам, а смайлики размещаются во многих блоках. Если вы хотите покрыть почти все эмодзи:

grep -P "[\x{1f300}-\x{1f5ff}\x{1f900}-\x{1f9ff}\x{1f600}-\x{1f64f}\x{1f680}-\x{1f6ff}\x{2600}-\x{26ff}\x{2700}-\x{27bf}\x{1f1e6}-\x{1f1ff}\x{1f191}-\x{1f251}\x{1f004}\x{1f0cf}\x{1f170}-\x{1f171}\x{1f17e}-\x{1f17f}\x{1f18e}\x{3030}\x{2b50}\x{2b55}\x{2934}-\x{2935}\x{2b05}-\x{2b07}\x{2b1b}-\x{2b1c}\x{3297}\x{3299}\x{303d}\x{00a9}\x{00ae}\x{2122}\x{23f3}\x{24c2}\x{23e9}-\x{23ef}\x{25b6}\x{23f8}-\x{23fa}]"  contact_names.tokens

(диапазон заимствован из ответ Сухая Гупты на аналогичный вопрос)

Если вам нужно разрешить / запретить определенные блоки эмодзи, см. данные о последовательности на unicode.org . Список смайликов в Википедии также показывает символы в упорядоченных таблицах, но может не отображать последние.

...