我很難寫一個正則表達式來放入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可以有很多很多的東西。它需要富_ *
我很難寫一個正則表達式來放入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可以有很多很多的東西。它需要富_ *
在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.
你需要一個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
隨着SED:
sed -n '/foo_bar/p;/foo_/!p' input
這告訴SED不是默認(-n
)和打印打印時任foo_bar
匹配或foo_
不匹配。
我想出了同一行..你是1分鐘快。 :) – Kent
這太棒了 - 在^和foo之間放置一個*的小修改,它完美地工作。 –
你是對的。我以你的例子爲基礎回答了這個問題,但你說它可能在文本中的任何地方。使用grep你可以刪除'^'而不必添加'。*' – lkuty