在 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 grep
as ggrep
,因此它不会与库存版本冲突。 GNUgrep
将在上面的示例中给出相同的行为,但两者有所不同:
$ echo foofoofoo | ggrep -o ^foo
foo
BSDgrep
将打印 3 个foo
s。
如果您用符号链接替换库存版本ggrep
,请注意某些操作系统更新将替换它。