Grep匹配一个单词而不是另一个单词

时间:2014-09-06 10:53:40

标签: regex grep

我想匹配一条没有后跟bar的行,例如

foo 123 <-- match
foo bar <-- not match

使用以下正则表达式不起作用:

echo "foo 123" | grep -E 'foo.*(?!bar).*'

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

在没有OSX grep -P的系统上,您可以使用此awk命令:

awk -F 'foo' 'NF>1{s=$0; $1=""; if (!index($0,"bar")) print s}' file

<强> Script Demo

答案 1 :(得分:2)

你可以尝试下面的grep命令,该命令使用-P(perl-regexp)参数,

grep -P 'foo(?:(?!bar).)*$' file

示例:

$ cat file
foo 123
foo bar
$ grep -P 'foo(?:(?!bar).)*$' file
foo 123

仅使用否定前瞻来检查字符串bar是否在foo之后,而不匹配任何后续字符。

$ grep -P 'foo(?!.*bar)' file
foo 123

答案 2 :(得分:0)

您可以使用-v来反转匹配:

grep -v 'foo.*bar' file