/ / Regexはfoo_barを含んでいるかどうかを調べる全ての行を見つけるかどうかを調べる - regex、grep

正規表現は、foo_barを含むかどうかをすべての行で見つけるか、fooではない - 正規表現、grep

私は正規表現を書いて、foo_barを含むすべての行と他のすべての行に一致させるgregeを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は多くの、多くのものになり得ます。

回答:

回答№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の場合は3

あなたはポストビーマッチとネガティブマッチを組み合わせる必要があります foo_barの正のマッチ1

foo_bar

そして、このすべてに対して負のマッチ2はfoo_を含んでいませんStack overflowの大きな説明 単語を含まない行と一致する正規表現ですか?

^((?!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

回答№3の場合は0

sedを使って:

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

これはデフォルトでは印刷されないようにsedに指示します(-n)、どちらかが foo_bar 一致または foo_ 一致していません。