Unix grep正则expression式包含“x”但不包含“y”

我需要一个单通道的正则expression式,其中包含,比如alpha,但不包含beta。

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

^((?!beta).)*alpha((?!beta).)*$会做我的想法。

在这里的其他答案显示了一些方法,你可以扭曲不同的正则expression式来做到这一点,但我认为一般来说,答案是“不这样做”。 这样的正则expression式读起来比较困难,而且执行起来可能比使用任何语言的布尔逻辑组合两个正则expression式要慢。 如果您在unix shell提示符下使用grep命令,只需将一个结果传送给另一个:

 grep "alpha" | grep -v "beta" 

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

那么因为我们都张贴答案,在这里是awk 😉

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

我希望这有帮助。

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

编辑:

其实,这似乎工作: ^[^y]*x[^y]*$ 。 它基本上是指“匹配任何以零或多个非y字符开始的行,然后有一个x,然后以零个或多个非y字符结尾”。

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