我很难写一个正则表达式放入grep来匹配包含foo_bar和所有其他行的所有行不包含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可以有很多很多东西。它需要是foo _。*
答案 0 :(得分:3)
你需要结合一个postivie匹配和一个负面匹配 因此foo_bar的积极匹配1
foo_bar
然后所有这一点的负匹配2不包含foo_使用Stack溢出很好的解释 Regular expression to match a line that doesn't contain a word?
^((?!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
答案 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 :(得分:0)
使用sed:
sed -n '/foo_bar/p;/foo_/!p' input
这告诉sed默认不打印(-n
)并在foo_bar
匹配或foo_
不匹配时打印。