1

我在无法调试的 grep 上遇到了一个令人费解的问题。这可以在 Mac OS High Sierra 上重现,但在当前的 Ubuntu 上不会出现问题(它可以按预期工作)。

我有三个文件:

cat haystack 
apple
aardvark
cow

cat pattern1
a
aardvark
animal

cat pattern2
c
b
apple

您可以使用以下命令创建这 3 个文件:

perl -e 'print "a\naardvark\nanimal"' > pattern1;
perl -e 'print "c\nb\napple"' > pattern2;
perl -e 'print "apple\naardvark\ncow"' > haystack;

这是问题所在:这会产生预期的响应:

grep -iowFf pattern2 haystack
apple

为了解释,grep...

-i = case insensitive
-o = display the match
-w = word match <== this is the option which is breaking it
     The expression is searched for as a word (as if surrounded by `[[:<:]]' and `[[:>:]]'
-F = fast grep (fixed strings)
-f = read pattern from file

这不返回任何内容:

grep -iowFf pattern1 haystack

但我希望“ pattern1”返回“ aardvark”。

我正在试验这个小型试验台,但我的实际项目要大得多。我发现当我改变patternN文件中行的顺序时,结果会改变。

sort -r pattern1 > pattern1.reverse
grep -iowFf pattern1.reverse haystack

那返回“ aardvark

我错过了什么?我一直在努力解决这个问题。这是 MacOS 10.13 中的错误吗?有解决方法吗?(是的,一种解决方法是在我的模式中用 \b....\b 替换 -w 参数并关闭 -F,但我正在处理非常大的文件,我想要性能。)

4

1 回答 1

4

在 MacOSX 上:

$ grep -V
grep (BSD grep) 2.5.1-FreeBSD

在 Centos7 例如

$ grep -V
grep (GNU grep) 2.20

现在,两个版本的工作方式不同(如您所见)。要解决此问题,您可以在 MacOSX 上brew install grep安装 GNU 版本的 grep,它会安装带有前缀的 GNU grep g。现在你可以这样做:

$ ggrep -iowFf pattern1 haystack
aardvark
于 2017-10-04T04:51:03.177 回答