2012-09-19 49 views
3

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

所以给出:

foo_bar Line 1 
foo_baz Line 2 
Line 3 
foo_biz Line 4 

我愿意线路1,3返回。

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

回答

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. 
+0

我想出了同一行..你是1分钟快。 :) – Kent

+0

这太棒了 - 在^和foo之间放置一个*的小修改,它完美地工作。 –

+0

你是对的。我以你的例子为基础回答了这个问题,但你说它可能在文本中的任何地方。使用grep你可以删除'^'而不必添加'。*' – lkuty

3

你需要一个postivie匹配和负匹配相结合 所以正匹配1 foo_bar这样

foo_bar 

然后负2场的这一切是不是含有foo_使用堆栈溢出很好的解释 Regular expression to match a line that doesn't contain a word?

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

都在altnernative正则表达式结合

(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 
0

随着SED:

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

这告诉SED不是默认(-n)和打印打印时任foo_bar匹配或foo_不匹配。

相关问题