包含'x'但不包含'y'的Unix grep正则表达式

时间:2011-05-19 18:33:18

标签: regex unix grep regex-negation

我需要一个unix grep的单行正则表达式,包含alpha,但不包含beta。

grep 'alpha' <> | grep -v 'beta'

6 个答案:

答案 0 :(得分:38)

这里的其他答案显示了一些方法,你可以扭曲不同种类的正则表达式来做到这一点,虽然我认为它确实证明答案是,一般来说,“不要这样做”。执行这些正则表达式比使用您使用的任何语言的布尔逻辑组合两个正则表达式要难得多,执行速度可能更慢。如果您在unix shell提示符下使用grep命令,只需将一个结果传递给另一个:

grep "alpha" | grep -v "beta"

我一直使用这种构造来从grep中剔除过多的结果。如果你知道哪个结果集会更小,那么首先将它放在管道中以获得最佳性能,因为第二个命令只需处理第一个输出而不是整个输入。

答案 1 :(得分:27)

好吧,我们都发布了答案,这里是awk; - )

awk '/x/ && !/y/' infile

我希望这会有所帮助。

答案 2 :(得分:19)

^((?!beta).)*alpha((?!beta).)*$会做我认为的伎俩。

答案 3 :(得分:3)

我很确定使用真正的正则表达式是不可能的。 [^y]*x[^y]*示例将匹配yxy,因为*允许零个或多个非y匹配。

编辑:

实际上,这似乎有效:^[^y]*x[^y]*$。它基本上意味着“匹配任何以零个或多个非y字符开头的行,然后有一个x,然后以零个或多个非y字符结尾”。

答案 4 :(得分:0)

尝试使用排除运算符:[^y]*x[^y]*

答案 5 :(得分:-2)

最简单的解决方案:

grep "alpha" * | grep -v "beta"

请注意空格和双引号。