grep:查找包含日语汉字的所有行


14

在一个巨大的UTF-8文本文件中,我想显示所有包含日语汉字的行
这是什么grep(或其他)表达?

如果我没有记错的话,kanjis是之间的字符\u4e00\u4dbf

我不需要显示kanas,但是也显示它们并不是一个大问题。

Answers:


12

不可能(不使用大桌子)将汉字与日本未使用的汉字表意字区分开(例如,中文或韩文变体)。

如果只想检测基本范围(\ 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]"

效果很好!
Nicolas Raoul

4

根据此处的第五张表,汉字是介于\u4e00和之间的字符\u9fff

我的实现grep似乎无法处理Unicode字符(在Archlinux上为GNU grep 2.14),但我们仍然可以使用\x。您可以在此处找到相应的代码或使用类似的工具hexedit来获取它们。

对于我们上面感兴趣的范围内的任何内容,e9 be a5返回“无效的归类字符”,这就是我想出的:

grep "["$'\xe4\xb8\x80'"-"$'\xe9\xbe\xa5'"]" file.txt

+1也可以,但是Pablo快了一点……
Nicolas Raoul

3
等同于grep "[一-龥]"。问题是它取决于语言环境,并使用归类规则;也就是说,只有定义了排序顺序的元素才能在范围内使用或匹配。-P不管区域设置如何,该开关仅执行二进制匹配。基于语言环境的方法将使用“字符范围”的区域性定义,基于二进制的方法将使用“范围”的编码值定义。特别是对于字母脚本,输出是完全不同的。(在这里,对于汉人的意识形态来说,这大致上是等效的)
Pablo Saratxaga
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.