我刚刚发现,如果我在我的 grep 命令前加上一个 LC_ALL=C,它会对加快 grep 速度产生奇迹。
但我想知道其中的含义。
使用 UTF-8 的模式会不匹配吗? 如果 grepped 文件使用 UTF-8 会怎样?
最佳答案
您不一定需要 UTF-8 在这里遇到麻烦。语言环境负责设置字符类,即确定哪个字符是空格、字母或数字。考虑这两个例子:
$ echo -e '\xe4' | LC_ALL=en_US.iso88591 grep '[[:alnum:]]' || echo false
ä
$ echo -e '\xe4' | LC_ALL=C grep '[[:alnum:]]' || echo false
false
当尝试将精确的二进制模式相互匹配时,语言环境并没有什么区别,但是:
$ echo -e '\xe4' | LC_ALL=en_US.iso88591 grep "$(echo -e '\xe4')" || echo false
ä
$ echo -e '\xe4' | LC_ALL=C grep "$(echo -e '\xe4')" || echo false
ä
我不确定 grep 实现 unicode 的程度,以及不同代码点之间的匹配程度,但是匹配 ASCII 的任何子集和没有备用二进制表示的单个字符的匹配应该可以正常工作,而不管语言环境如何。
关于bash - LC_ALL=C 对加速 grep 的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8138124/