考虑:
$ 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
两者都不区分大小写地搜索。为什么这个-i
版本这么慢?如何grep -i
在不输入类似[iI][nN] [tT][hH][iI][sS] [wW][aA][Yy]
?的内容的情况下加快速度?
例如,
perl -ne 'print if /descend ?from/i'
运行速度很快,但是 '-B 5' 的实现并不像 grep(以及其他选项)那么简单。
答案1
答案2
假设
这些违反直觉的结果可以用以下公式来解释。您的正则表达式与不同,grep -i
因为grep -i
它更通用,考虑到复杂的多字节字符串处理,至少在使用预处理器符号编译时是这样MBS_SUPPORT
。
请看这里:
http://cvs.savannah.gnu.org/viewvc/grep/grep/src/search.c?revision=1.42&view=markup
寻找match_icase
和MBS_SUPPORT
。
答案3
如果 find 的实际情况并不重要,您可以在之前使用tr
折叠。[A-Z]
[a-z]
grep