grep -o 在 OSX 上的行为

grep -o 在 OSX 上的行为

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

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

f
o
o

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

有人可以启发我吗?

答案1

您已经注意到这是一个有趣的行为。

将其归类为“错误”是错误的,因为POSIX 没有指定-o选项grep。你可能不喜欢它的行为方式,而且我同意 BSD 和 GNU 的grep不同很烦人,但这种行为实际上并不与 BSD 手册页所说的相冲突。如果你仍然说这是一个错误,那么,你知道,那就是,你的观点, 男人。 :)

也许这个替代演示会向您展示它的行为原因:

$ echo foofoofoo | grep -o foo
foo
foo
foo

即BSDgrep和GNU都grep显示全部该行的匹配部分,而不仅仅是第一个。不同之处在于 BSDgrep似乎是通过消耗匹配的部分然后再次匹配来实现的。当它删除f示例中的前导时,它会发现o后面的内容也匹配,下一个也是如此。

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

 $ echo foofoofoo | ggrep -o ^foo
 foo

BSDgrep将打印 3 个foos。

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

相关内容