如果我这样做,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)。
答案2
对我来说似乎是一个错误。如果您不介意使用grep
macports (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.