为什么 grep -o -w 在 Mac OS X 上没有给出预期的输出?

为什么 grep -o -w 在 Mac OS X 上没有给出预期的输出?

如果我这样做,echo foo bar baz | grep -o -w baz输出是foo bar baz(和一个额外的换行符)。
预期的输出将是,baz因为 -o 选项应该只显示匹配的部分。
我使用的是 Mac OS X 10.7.1,grep 版本是grep (GNU grep) 2.5.1

答案1

有一个解决方法是使用grep正则表达式语法来匹配单词开头和结尾的空字符串!

# grep regex syntax for matching words only
man grep | less -p '\<'

# POSIX 1003.2 regular expression syntax for matching words only
# should work for sed, ed, ...
man re_format | less -p '\[\[:<:\]\]'

echo 'foo bar baz' | egrep -o '\<baz\>'

echo 'foo bar baz' | sed -n '/.*[[:<:]]\(baz\)[[:>:]].*/s//\1/p'

如果您坚持使用grep's-w标志,请尝试预编译的 Rudix 2010grep二进制文件 (grep-2.5.4-1.dmg)。

http://rudix.org/packages-ghi.html#grep

答案2

对我来说似乎是一个错误。如果您不介意使用grepmacports (v 2.9) 中的功能,它的行为方式将符合您的预期。

2.5.1 似乎离最新版本还很远,但我想你可以尝试用 Apple 来填补 bug。

答案3

在 10.8 中,/usr/bin/grep被替换为不同版本的 grep,它似乎没有这个问题:

$ echo foo bar baz | grep -o -w baz
baz
$ grep -V
grep (BSD grep) 2.5.1-FreeBSD

10.7:

$ echo foo bar baz | grep -o -w baz
foo bar baz

$ grep -V
grep (GNU grep) 2.5.1

Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

答案4

grep或者,您可以通过安装更新​​版本的 GNU自制:

brew install grep

然后执行以下操作:

$ echo foo bar baz | ggrep -o -w baz
baz

相关内容