在Linux中使用grep搜索表情符号

9

我个人使用这个模式时会出现“指定了冲突的匹配器”错误。 - ahmet alp balkan
2个回答

12

您需要使用完整值指定代码点(不是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 在类似问题上的回答

如果您需要允许/禁止特定的表情符号块,请参见Unicode.org上的序列数据维基百科上的表情符号列表也展示了按顺序排列的字符,但可能没有列出最新的。


终于找到了一个干净的解决方案,可以在使用youtube-dl时摆脱所有那些表情符号。 - Sridhar Sarnobat

2
您可以使用ugrep作为grep的替代品来做到这一点:
ugrep "[\x{1F1FF}-\x{1F600}]" contact_names.tokens  
ugrep默认匹配Unicode模式(使用选项-U禁用)。正则表达式语法符合POSIX ERE标准,扩展了Unicode字符类、惰性量词和负模式,以跳过不需要的模式匹配,从而产生更精确的结果。
当存在UTF BOM(字节顺序标记)时,ugrep搜索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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接