在 Linux 上,当我echo foo | grep -o '^.'获取第一个字符时,它会f按预期打印。(我知道,| cut -c1可能会更快。)
但在 OSX 上,在 3 场比赛(3 行)中得到相同的结果:
f
o
o
Run Code Online (Sandbox Code Playgroud)
跆拳道?即使没有-o选项,输出的颜色(在我的环境中)告诉我整行匹配,而不仅仅是第一个字符。
任何人都可以请教我吗?
你在那里注意到了一个有趣的行为。
将其归类为“错误”是错误的,因为POSIX 没有-o为grep. 你可能不喜欢它的行为方式,我同意 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,请注意某些操作系统更新将替换它。
| 归档时间: |
|
| 查看次数: |
1566 次 |
| 最近记录: |