在 OSX 上 grep -o 的行为

Pat*_*rik 6 osx grep

在 Linux 上,当我echo foo | grep -o '^.'获取第一个字符时,它会f按预期打印。(我知道,| cut -c1可能会更快。)

但在 OSX 上,在 3 场比赛(3 行)中得到相同的结果:

f
o
o
Run Code Online (Sandbox Code Playgroud)

跆拳道?即使没有-o选项,输出的颜色(在我的环境中)告诉我整行匹配,而不仅仅是第一个字符。

任何人都可以请教我吗?

War*_*ung 6

你在那里注意到了一个有趣的行为。

将其归类为“错误”是错误的,因为POSIX 没有-ogrep. 你可能不喜欢它的行为方式,我同意 BSD 和 GNU 的grep不同很烦人,但这种行为实际上与 BSD 手册页所说的并不冲突。如果你仍然说这是一个错误,那么,你知道,这只是你的意见,伙计。:)

也许这个替代演示会告诉你为什么它会这样:

$ echo foofoofoo | grep -o foo
foo
foo
foo
Run Code Online (Sandbox Code Playgroud)

也就是说,BSDgrep和 GNU 都grep显示了该行的所有匹配部分,而不仅仅是第一个。不同之处在于 BSDgrep似乎是通过消耗匹配的部分然后再次匹配来实现的。当它删除f您的示例中的前导时,它发现o它与下一个匹配,也与下一个匹配。

对此的一种解决方法是安装Homebrew,然后说brew install grep. 这将使您获得 GNU grepas ggrep,因此它不会与股票版本发生冲突。GNUgrep将在我上面的示例中给出相同的行为,但两者在此方面有所不同:

 $ echo foofoofoo | ggrep -o ^foo
 foo
Run Code Online (Sandbox Code Playgroud)

BSDgrep将打印三个foos。

如果您使用指向 的符号链接替换库存版本ggrep,请注意某些操作系统更新将替换它。