grep与MacOS 10.13上的模式文件的解决方法

时间:2017-10-03 21:05:10

标签: grep macos-high-sierra

我有一个令人困惑的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

但我希望&#34; pattern1&#34;返回&#34; aardvark&#34;。

我正在尝试使用这个小型测试平台,但我真正的项目要大得多。我发现当我更改patternN文件中的行序列时,结果会发生变化。

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

返回&#34; aardvark&#34;

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

1 个答案:

答案 0 :(得分:3)

在MacOSX上:

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

在Centos7上,例如

$ grep -V
grep (GNU grep) 2.20

现在,两个版本的工作方式不同(正如您所注意到的)。要解决此问题,您可以在MacOSX上安装GNU版本的grep,brew install grep安装GNU grep,前缀为g。现在你可以做到:

$ ggrep -iowFf pattern1 haystack
aardvark