我正在从文本中删除停用词,大致使用此 代码
我有以下
$ 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。☺