我在无法调试的 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,但我正在处理非常大的文件,我想要性能。)