我想匹配foo之後沒有跟着條的行,例如,grep匹配一個單詞,但不匹配另一個單詞
foo 123 <-- match
foo bar <-- not match
使用正則表達式如下不起作用:
echo "foo 123" | grep -E 'foo.*(?!bar).*'
任何想法?
我想匹配foo之後沒有跟着條的行,例如,grep匹配一個單詞,但不匹配另一個單詞
foo 123 <-- match
foo bar <-- not match
使用正則表達式如下不起作用:
echo "foo 123" | grep -E 'foo.*(?!bar).*'
任何想法?
你可以試試它採用-P
(Perl的正則表達式)參數以下grep命令,
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
在沒有grep -P
像OSX您可以使用此命令awk
系統:
awk -F 'foo' 'NF>1{s=$0; $1=""; if (!index($0,"bar")) print s}' file
您可以使用-v
反轉匹配:
grep -v 'foo.*bar' file
但是不會在沒有'foo'的行上匹配?但是,'grep foo | grep -v bar'可能取決於OP的要求。 – 2014-09-06 18:11:58