我很难写一个正则表达式来放入grep,以匹配所有包含foo_bar的行和所有其他行不包含foo _。*(除了foo_bar应该仍然匹配)。正则表达式找到所有包含foo_bar或不包含foo_bar的行
所以给出:
foo_bar Line 1
foo_baz Line 2
Line 3
foo_biz Line 4
我愿意线路1,3返回。
注意我不能只匹配foo_baz而不是foo_biz,因为baz和biz可以有很多很多的东西。它需要富_ *
我很难写一个正则表达式来放入grep,以匹配所有包含foo_bar的行和所有其他行不包含foo _。*(除了foo_bar应该仍然匹配)。正则表达式找到所有包含foo_bar或不包含foo_bar的行
所以给出:
foo_bar Line 1
foo_baz Line 2
Line 3
foo_biz Line 4
我愿意线路1,3返回。
注意我不能只匹配foo_baz而不是foo_biz,因为baz和biz可以有很多很多的东西。它需要富_ *
在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.
你需要一个postivie匹配和负匹配相结合 所以正匹配1 foo_bar这样
foo_bar
然后负2场的这一切是不是含有foo_使用堆栈溢出很好的解释 Regular expression to match a line that doesn't contain a word?
^((?!foo_.*).)*$
都在altnernative正则表达式结合
(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
随着SED:
sed -n '/foo_bar/p;/foo_/!p' input
这告诉SED不是默认(-n
)和打印打印时任foo_bar
匹配或foo_
不匹配。
我想出了同一行..你是1分钟快。 :) – Kent
这太棒了 - 在^和foo之间放置一个*的小修改,它完美地工作。 –
你是对的。我以你的例子为基础回答了这个问题,但你说它可能在文本中的任何地方。使用grep你可以删除'^'而不必添加'。*' – lkuty