私は正規表現を書いて、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の場合は3OS 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_
一致していません。