正则表达式查找包含foo_bar或不包含foo的所有行

时间:2012-09-19 15:08:03

标签: regex grep

我很难写一个正则表达式放入grep来匹配包含foo_bar和所有其他行的所有行不包含foo _。*(除了应该仍然匹配的foo_bar)。

所以给出:

foo_bar Line 1
foo_baz Line 2
Line 3
foo_biz Line 4

我想要第1和第3行返回。

注意我不能只匹配foo_baz而不是foo_biz,因为baz和biz可以有很多很多东西。它需要是foo _。*

3 个答案:

答案 0 :(得分:3)

你需要结合一个postivie匹配和一个负面匹配 因此foo_bar的积极匹配1

foo_bar

然后所有这一点的负匹配2不包含foo_使用Stack溢出很好的解释 Regular expression to match a line that doesn't contain a word?

^((?!foo_.*).)*$

在altnernative regexp中结合两者

(foo_bar|^((?!foo_.*).)*$)

现在让我们试试::

    $ cat <<EOF | perl -ane ' /(foo_bar|^((?!foo_.*).)*$)/ && print $_'
    > foo_bar 1
    > fee_foo
    > foo bar
    > foo_buz RT
    > fo_foo 1 
    > fo_ foo_bar
    > EOF

给出

foo_bar 1
fee_foo
foo bar
fo_foo 1 
fo_ foo_bar

答案 1 :(得分:3)

在OS X下,我在您的输入上执行了以下命令:

$ grep -P -v '^foo_(?!bar)' test.txt 
foo_bar Line 1
Line 3

请注意:

-P, --perl-regexp
       Interpret PATTERN as a Perl regular expression.
-v, --invert-match
       Invert the sense of matching, to select non-matching lines.

答案 2 :(得分:0)

使用sed:

sed -n '/foo_bar/p;/foo_/!p' input

这告诉sed默认不打印(-n)并在foo_bar匹配或foo_不匹配时打印。