2012-09-19 72 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_不匹配。

相關問題