我用grep遇到了一些非常奇怪的行为,我无法弄明白。我试图从单词文件中过滤常用单词,但grep似乎忽略了基于其顺序的某些模式。 以下是显示失败的最小示例:
测试文件:
a
foo
an
bar
he
the
命令结果:cat test.txt | fgrep -v -w -e 'an' -e 'the' -e 'a' -e 'he'
foo
bar
命令结果:cat test.txt | fgrep -v -w -e 'a' -e 'an' -e 'he' -e 'the'
foo
an
bar
the
我无法找到任何表明grep应该显示此类顺序敏感度的内容,显然当我扩展到实际输入和过滤器列表时,这是一个严重的问题。我怀疑这实际上是安装的grep版本中的一个错误 - 我在MacOS Mavericks上运行,并且无法在Ubuntu机器上重现此错误。
答案 0 :(得分:1)
我已经回答了我自己的问题:这是由Apple分发的grep版本中的一个错误(感谢fedorui和java10确认这不是预期的行为)。 Apple发布的当前版本是BSD grep:2.5.1-FreeBSD。
要解决此问题,请安装GNU grep。我建议用brew来做这件事:
brew tap homebrew/dupes; brew install homebrew/dupes/grep
这不会替换原生grep(谁知道可能依赖的东西),而是安装为'ggrep',然后行为正确。
答案 1 :(得分:0)
为了扩展您自己的答案,OSX使用BSD grep,Linux使用GNU grep。如果你想用GNU grep永久替换BSD grep,你可以这样做:
brew tap homebrew/dupes
brew install homebrew/dupes/grep --default-names
然后你就可以使用" grep"命令而不是" ggrep"命令。这对依赖GNU grep正常工作的shell脚本很有用。
发出上述命令后,您可以测试grep
是否映射到GNU可执行文件:
which grep
/usr/local/bin/grep
我在很长一段时间内完全切换到GNU grep(以及所有其他核心实用程序)。我每天都用我的mac编程。它尚未爆发:) YMMV。