扩展的正则表达式:查找不属于另一个单词的单词

时间:2018-11-06 01:24:30

标签: unix grep

我正在尝试使用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).)*' 

2 个答案:

答案 0 :(得分:0)

这可能就是您要寻找的

egrep '\bfoo\b'

与单词边界匹配的

答案 1 :(得分:0)

Perl正则表达式支持negative lookahead,您尝试使用的(?!)功能。这是表达“ foo但不是foobar”的理想方法。

grep -P 'foo(?!bar)'

如果限于POSIX扩展正则表达式,则没有等效功能。可能会但不知所措地寻找没有负前瞻的不匹配项。

一种方法是逐个检查foo之后的字符。下一个字符是

  1. 字符串结尾($
  2. 除“ b”([^b])以外的任何字符
  3. A“ b”(b

如果这是前两种情况之一,则是匹配项。如果它是b,则必须使用相同的三部分模式检查b之后的字符。模式看起来像$|[^b]|b(...),其中...表示嵌套模式。将所有嵌套的模式放在一起即可得到:

grep -E 'foo($|[^b]|b($|[^a]|a($|[^r])))'