gpt4 book ai didi

regex - 为什么 Bash 模式匹配 ?(*[[ :class:]])foobar slow?

转载 作者:行者123 更新时间:2023-11-29 09:17:38 24 4
gpt4 key购买 nike

我有一个文本文件 foobar.txt,大约 10KB,没那么长。然而,以下匹配搜索命令在高性能 Linux 机器上大约需要 10 秒。

bash>shopt -s extglob
bash>[[ `cat foobar.txt` == ?(*[[:print:]])foobar ]]

没有匹配:foobar.txt 中的所有字符都是可打印的,但没有字符串“foobar”。

搜索应该尝试匹配两个备选方案,它们中的每一个都不会匹配:

"foobar"

那是瞬间

*[[:print:]]foobar

- 应该是这样的:

应该一次一个字符地扫描文件,每次检查下一个字符是否是

[[:print:]]foobar

这也应该很快,每个字符绝不会花费一毫秒。

其实如果我放下?,也就是做

bash>[[ `cat foobar.txt` == *[[:print:]]foobar ]]

瞬间的。但这只是上面的第二种选择,没有第一种。

为什么这么长?

最佳答案

bash 中的 glob 匹配器并未优化。参见,例如,this bug-bash thread ,在此期间 bash 维护者 Chet Ramey 说:

It's not a regexp engine, it's an interpreted-on-the-fly matcher.

因为 bash 也包含一个正则表达式引擎(使用 =~ 而不是 [[ ]] 中的 ==),所以可能没有有很大的动力去做任何事情。

在我的机器上,等效的正则表达式 (^(.*[[:print:]])?foobar$) 受到语言环境感知 [[:print:]] 的影响;出于某种原因,这并没有影响 glob 匹配器。设置 LANG=C 使正则表达式工作正常。

但是,对于这么大的字符串,我会使用 grep。

关于regex - 为什么 Bash 模式匹配 ?(*[[ :class:]])foobar slow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18412294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com