Answers:
不可能(不使用大桌子)将汉字与日本未使用的汉字表意字区分开(例如,中文或韩文变体)。
如果只想检测基本范围(\ u4e00至\ u9fff)中的任何汉字表意符号,则它们会以3个字节进行编码,第一个字节始终在0xe4和0xe9之间,第二个和第三个字节在0x80和0xbf之间。
这里有两个困难,首先,您必须告诉grep您要照顾字节而不是字符。那么您必须输入0xe4、0xe9、0x80和0xbf字节才能将其放入regexp表达式中。
我发现-P开关可以同时完成这两个;而您想要的行是:
grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]"
如果您也想要假名:
grep -P "[\xe4-\xe9][\x80-\xbf][\x80-\xbf]|\xe3[\x81-\x83][\x80-\xbf]"
根据此处的第五张表,汉字是介于\u4e00
和之间的字符\u9fff
我的实现grep
似乎无法处理Unicode字符(在Archlinux上为GNU grep 2.14),但我们仍然可以使用\x
。您可以在此处找到相应的代码,或使用类似的工具hexedit
来获取它们。
对于我们上面感兴趣的范围内的任何内容,e9 be a5
返回“无效的归类字符”,这就是我想出的:
grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt
grep "[一-龥]"
。问题是它取决于语言环境,并使用归类规则;也就是说,只有定义了排序顺序的元素才能在范围内使用或匹配。-P
不管区域设置如何,该开关仅执行二进制匹配。基于语言环境的方法将使用“字符范围”的区域性定义,基于二进制的方法将使用“范围”的编码值定义。特别是对于字母脚本,输出是完全不同的。(在这里,对于汉人的意识形态来说,这大致上是等效的)