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ď č. 1V 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.