我正在尝试使用egrep搜索文件中的单词。我仅限于egrep
,并且无法添加-v
选项,因此我必须通过模式来完成。
示例文件
... blah
blah foo blah
blah foobar blah
bhah_foobaz_blah
blah ...
所需的输出
blah foo blah
bhah_foobaz_blah
我想查找包含foo
实例的每一行,该实例不属于单词foobar
的一部分。
从到目前为止我能找到的东西,我以为会是这样,但是什么也没返回:
egrep -i 'foo+^((?!bar).)*'
答案 0 :(得分:0)
这可能就是您要寻找的
egrep '\bfoo\b'
与单词边界匹配的
答案 1 :(得分:0)
Perl正则表达式支持negative lookahead,您尝试使用的(?!)
功能。这是表达“ foo但不是foobar”的理想方法。
grep -P 'foo(?!bar)'
如果限于POSIX扩展正则表达式,则没有等效功能。可能会但不知所措地寻找没有负前瞻的不匹配项。
一种方法是逐个检查foo
之后的字符。下一个字符是
$
)[^b]
)以外的任何字符b
)如果这是前两种情况之一,则是匹配项。如果它是b
,则必须使用相同的三部分模式检查b
之后的字符。模式看起来像$|[^b]|b(...)
,其中...
表示嵌套模式。将所有嵌套的模式放在一起即可得到:
grep -E 'foo($|[^b]|b($|[^a]|a($|[^r])))'