grep用于Linux中的表情符号

时间:2018-09-10 22:31:43

标签: unicode grep emoji

我试图遍历包含多个非ASCII字符的令牌列表。我只想匹配表情符号,其他字符(例如ð或ñ)都可以。表情符号的unicode范围似乎是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 :(得分:0)

您需要指定完整值的代码点(不是1F6,而是1F600),并用花括号将它们包装起来。此外,第一个值必须小于最后一个值。 因此,正则表达式应为"[\x{1F1FF}-\x{1F600}]"

但是,表情符号的unicode范围比您想象的要复杂。您所引用的页面不会按代码点对字符进行排序,并且表情符号放置在许多块中。如果您想涵盖几乎所有的表情符号:

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

(该范围是从Suhail Gupta's answer借来的类似问题)

如果需要允许/禁止特定的表情符号块,请参见sequence data on unicode.orgList of emoji on Wikipedia还会在有序表中显示字符,但可能不会列出最新的字符。

答案 1 :(得分:0)

您可以使用ugrep代替grep来实现此目的:

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

ugrep 默认情况下匹配Unicode模式(通过选项-U禁用)。   正则表达式语法符合POSIX ERE,扩展了   Unicode字符类,惰性量词和负模式   跳过不需要的模式匹配以产生更精确的结果。

     

ugrep 在使用UTF BOM(字节顺序标记)时搜索UTF编码的输入   如果没有UTF BOM,则显示ASCII和UTF-8。选项   --encoding允许搜索许多其他文件格式,例如ISO-8859-1,EBCDIC和代码页437、850、858、1250至1258。

     

ugrep 搜索文本和二进制文件,并为十六进制匹配生成十六进制转储。

表情符号的Unicode范围大于1F1FF + U到1F600 + U的范围。请参阅Unicode 12官方出版物https://unicode.org/emoji/charts-12.0/full-emoji-list.html