3

foo_bar を含むすべての行と foo_.* を含まない他のすべての行に一致するように grep に入れる正規表現を書くことに困惑しています (まだ一致するはずの foo_bar を除く)。

与えられた:

foo_bar Line 1
foo_baz Line 2
Line 3
foo_biz Line 4

1号線と3号線を返してほしい。

baz と biz は非常に多くのものになる可能性があるため、not foo_baz と not foo_biz を一致させることはできないことに注意してください。foo_.* である必要があります

4

3 に答える 3

3

事後一致と負の一致を組み合わせる必要があるので、foo_barの正の一致1

foo_bar

次に、これらすべての負の一致2には、スタックオーバーフローを使用したfoo_が含まれていません。優れた説明 単語を含まない行に一致する正規表現?

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

代替正規表現で両方を組み合わせる

(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
于 2012-09-19T15:17:54.983 に答える
3

OS XI では、入力に対して次のコマンドを実行しました。

$ 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.
于 2012-09-19T15:24:24.233 に答える
0

sed付き:

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

これは、デフォルト(-n)で印刷せず、一致するかfoo_bar一致しない場合に印刷するようにsedに指示しますfoo_

于 2012-09-19T15:19:40.530 に答える