/ / Regex nájsť všetky riadky obsahujúce foo_bar alebo nie foo - regex, grep

Regex nájsť všetky riadky obsahujúce foo_bar alebo not foo - regex, grep

Som sa pokúsil písať regex, aby sa zaradil do grep tak, aby zodpovedal všetkým riadkom, ktoré obsahujú foo_bar a všetky ostatné riadky, aby neobsahovali foo _. * (Okrem foo_bar, ktorý by mal stále zodpovedať).

Takže:

foo_bar Line 1
foo_baz Line 2
Line 3
foo_biz Line 4

Chcem, aby sa vrátili riadky 1 a 3.

Poznámka: Nemôžem odpovedať len foo_baz a nie foo_biz ako baz a biz môže byť veľa veľa vecí.To musí byť foo _. *

odpovede:

3 pre odpoveď č. 1

V systéme OS X som na svojom zadaní vykonal nasledujúci príkaz:

$ grep -P -v "^foo_(?!bar)" test.txt
foo_bar Line 1
Line 3

Vezmite prosím na vedomie, že :

-P, --perl-regexp
Interpret PATTERN as a Perl regular expression.
-v, --invert-match
Invert the sense of matching, to select non-matching lines.

3 pre odpoveď č. 2

Musíte kombinovať postiví zápas a negatívny zápas Takže pozitívny zápas 1 pre foo_bar

foo_bar

Potom negatívna zhoda 2 pre toto všetko neobsahuje foo_ pomocou veľkého vysvetlenia pretečenia zásobníka Pravidelný výraz, ktorý zodpovedá riadku, ktorý neobsahuje slovo?

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

Kombinácia oboch v altnernative regexp

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

Teraz sa pokúsime:

    $ 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

poskytuje

foo_bar 1
fee_foo
foo bar
fo_foo 1
fo_ foo_bar

0 pre odpoveď č. 3

S sed:

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

toto informuje, že sed nebude štandardne tlačiť (-n) a vytlačiť, ak jeden foo_bar alebo foo_ nezhoduje sa.