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]*