用单字母词grep奇怪的行为

Tim*_*Tim 10 osx freebsd grep

我正在从文本中删除停用词,大致使用此 代码

我有以下

$ cat file
file
types
extensions

$ cat stopwords
i
file
types
Run Code Online (Sandbox Code Playgroud)

grep -vwFf stopwords file

我期待结果: extensions

但我得到了(我认为不正确)

file
extensions
Run Code Online (Sandbox Code Playgroud)

就好像file在停用词文件中跳过了该词。现在是很酷的一点:如果我修改停用词文件,通过将i第一行的单个单词/字母更改为除f, i, l,之外的任何其他 ascii 字母e,那么相同的 grep 命令会给我一个不同且正确的结果extensions

这里发生了什么,我该如何解决?

我在 Mac OSX GNU bash 版本 4.4.12(1) 上使用 grep (BSD grep) 2.5.1-FreeBSD

Jde*_*eBP 13

这是 中的一个错误bsdgrep,与一个变量有关,该变量跟踪当前行的仍要扫描的部分,当涉及多个模式时,该变量会被对正则表达式匹配引擎的连续调用覆盖。

本地修复

您可以通过不使用该-w选项在一定程度上解决此问题,该选项依赖于此变量进行正确操作,因此失败,而是使用匹配单词开头和结尾的正则表达式扩展名,使您的stopwords文件看起来像:

\<i\>
\<文件\>
\<类型\>

此解决方法还要求您不要使用该-F选项。

请注意,文件的正则表达式的组件[[:<:]][[:>:]]re_format手册告诉你关于会不会在这里工作。这是因为编译成的正则表达式库bsdgrep开启了 GNU 正则表达式兼容性支持。这是另一个错误,据报道已修复。

服务修复

这个错误在今年早些时候得到了修复。该修复程序尚未进入 FreeBSD 的 STABLE 或 RELEASE 版本,但据报道已在 CURRENT 中。

要将其引入grep源自 FreeBSD 的MacOS 版本bsdgrep,请咨询 Apple。☺

进一步阅读