grep单字母单词的奇怪行为


10

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

我有以下

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

我期待结果: extensions

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

file
extensions

就像file停用词文件中已跳过该词一样。现在,这里的凉爽一下:如果我修改停用字词档案,通过改变单个字/字母i在第一行,其他任何ASCII字母以外file,那么同样grep命令给我的不同,正确的结果extensions

这是怎么回事,我该如何解决?

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


您可能想将-x开关用于行正则表达式而不是-w单词?但是,我认为此-F开关将取消其中任何一个,反之亦然。
jesse_b

grep(GNU grep)3.1可以按预期工作。
Hauke Laging,

我已经复制了这个。另一个数据:在文件中将i模式设置为第二个模式而不是第一个模式stopwords也将改变行为。
JdeBP

我无法使用本机grep或GNU grep3.1 在OpenBSD 6.2上重现该行为。
库萨兰达

Answers:


13

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

本地修复

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

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

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

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

服务修复

该错误已于今年年初修复。该修复程序尚未使它成为FreeBSD的STABLE或RELEASE风格,但据报道它是最新的。

要将其放入grep从FreeBSD衍生的MacOS版本中bsdgrep,请咨询Apple。☺

进一步阅读


很好,感谢您报告此上游。如果引用了错误代码,我会发现这个答案更加令人着迷。
dhag

1

这段代码:

pl " Input data file data1 and stopwords file data2:"
head data1 data2

pl " Expected output:"
cat $E

pl " Results, grep:"
# grep -vwFf stopwords file
grep -vwFf data2 data1

pl " Results, cgrep:"
cgrep -x1 -vFf data2 data1

产生:

-----
 Input data file data1 and stopwords file data2:
==> data1 <==
file
types
extensions

==> data2 <==
i
file
types

-----
 Expected output:
extensions

-----
 Results, grep:
file
extensions

-----
 Results, cgrep:
extensions

在像这样的系统上:

OS, ker|rel, machine: Apple/BSD, Darwin 16.7.0, x86_64
Distribution        : macOS 10.12.6 (16G29), Sierra
bash GNU bash 3.2.57

有关cgrep的更多详细信息,可通过brew和sourceforge获得:

cgrep   shows context of matching patterns found in files (man)
Path    : ~/executable/cgrep
Version : 8.15
Type    : Mach-O64-bitexecutablex86_64 ...)
Home    : http://sourceforge.net/projects/cgrep/ (doc)

干杯


刚给我自己一个新grep。
蒂姆(Tim)

@Tim-希望您发现cgrep和我一样有用。我完成测试的速度使其与GNU grep大致相当,并且“上下文/窗口”功能非常有用。它还可以轻松地在Linux系统上构建...干杯,drl
drl 17-10-18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.