为什么“grep -i”这么慢?如何更快地为 ASCII 做到这一点?

Vi.*_*Vi. 2 linux grep

考虑:

$ time lzop -d < tvtropes-index.lzo | egrep -B 5 '[Dd][eE][sS][cC][eE][nN][dD] ?[Ff][rR][oO][mM]'
real    0m0.438s

$ time lzop -d < tvtropes-index.lzo | egrep -B 5 'descend ?from' -i
real    0m11.294s
Run Code Online (Sandbox Code Playgroud)

两者均不区分大小写。为什么-i版本这么慢?我如何在grep -i不输入 [iI][nN] [tT][hH][iI][sS] [wW][aA][Yy] 之类的东西的情况下加快速度?

例如,

perl -ne 'print if /descend ?from/i'
Run Code Online (Sandbox Code Playgroud)

工作速度很快,但 '-B 5' 不像在 grep (以及其他选项)中那样容易实现。

Red*_*ick 6

外壳折叠很难

简单地将 [az] 映射到 [AZ] 适用于大多数简单的纯 ASCII 文本文档。然而,当我们探索使用额外字符的其他语言时,它开始崩溃。它还没有考虑到某些语言中的大小写映射并不总是算法或静态的事实。

例如,如果大小写折叠 [az] -> [AZ],像“Dürst”或“résumé”这样的字符串最终可能看起来有点奇怪:“DüRST”或“RéSUMé”。

您可以通过使用古老的 grep 或使用语言环境 (LC_ALL=C?) 再次说服 grep 世界是 ASCII 来加快速度。

这段对话提到了“UTF8 语言环境的大量减速”,但没有帮助。

  • 抱歉,“LANG=C grep -i”有效(再次测试正确)。 (2认同)