Unix grep regex包含';x';但不包含';y';

Unix grep regex包含';x';但不包含';y';,regex,unix,grep,regex-negation,Regex,Unix,Grep,Regex Negation,我需要一个unix grep的单通道正则表达式,它包含(比如)alpha,但不包含beta grep 'alpha' <> | grep -v 'beta' grep'alpha'| grep-v'beta' 尝试使用excludes操作符:[^y]*x[^y]*^((?!beta)。*alpha((?!beta)。*$我认为这在真正的正则表达式中是不可能的。[^y]*x[^y]*示例将匹配yxy,因为*允许零个或多个非y匹配 编辑: 实际上,这似乎有效:^[^y]*x[^y]*$

我需要一个unix grep的单通道正则表达式,它包含(比如)alpha,但不包含beta

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

尝试使用excludes操作符:
[^y]*x[^y]*
^((?!beta)。*alpha((?!beta)。*$
我认为这在真正的正则表达式中是不可能的。
[^y]*x[^y]*
示例将匹配yxy,因为*允许零个或多个非y匹配

编辑:


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

我们都在发布答案,这里是awk;-)


我希望这能有所帮助。

这里的其他答案展示了一些方法,你可以通过扭曲不同的正则表达式来做到这一点,尽管我认为答案是,一般来说,“不要这样做”。与使用任何语言的布尔逻辑组合两个正则表达式相比,此类正则表达式更难阅读,执行速度也可能较慢。如果在unix shell提示符下使用
grep
命令,只需将一个命令的结果传递到另一个命令:

grep "alpha" | grep -v "beta"

我一直在使用这种构造来筛选
grep
中过多的结果。如果您知道哪个结果集更小,请将该结果集放在管道中的第一个以获得最佳性能,因为第二个命令只需处理第一个命令的输出,而不必处理整个输入。

最简单的解决方案:

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


请注意空格和双引号。

[^y]*
匹配字符串
y
,因为该字符串中没有非y字符。是吗?我的示例是[^y]*x[^y]*。请注意,我回答问题的抽象级别与问题本身相同。提问者希望匹配包含
alpha
但不包含
beta
的字符串。字符串
alphabeta
不符合提问者的标准(它包含字符串
beta
),但正则表达式将返回true,因为在子字符串
alpha
之前,字符串
beta
的出现次数为零或更多。这取决于边界条件,这是问题没有问到的。请发布一个示例输入和预期输出。您如何期望非“y”不匹配除“x”之外的所有行?。这是另一种说法,表示您可能需要一个grep1过程,但您可能需要一个grep2过程或一个onepass的awk或perl脚本。顺便说一句,这不是我的反对票。也许有人会解释为什么这是个糟糕的问题?!祝你好运。我认为这绝对是一个可以问的合理问题(来自我的so+1),特别是我以前看到过它被问过,甚至我自己也问过。@Sheller:我知道使用awk、sed和perl来做这件事的各种方法。甚至grep命令也可以使用管道(在问题中添加了一条采样线)。我只是想看看能不能一次完成。看起来这是可以做到的(下面是Mr47的答案),我学会了用perl向前看和向后看。用任何语言学习新技巧都很有趣。我不明白你为什么认为这个问题不好。我也投票支持你的答案请重新阅读我的评论这不是我的反对票“。。事实上,在看到你投了两张反对票后,我给了你一票。我同意你关于学习新技术的看法。我得走了。祝你好运同意。下次会更详细。谢谢你的时间!我很确定POSIX
grep
不支持这样的语法!我没有测试它,但我很确定我的grep版本支持这样的语法。可能是错误的。你能解释一下“(”和“?”在这里是如何工作的吗?我不明白为什么一开始就有2“(”。这是一个PCRE(Perl兼容的正则表达式),所以你需要GNU Grep的-P选项。the(?!…)这些都是零宽度的负前瞻断言。我建议
perldoc perlre
来解释前瞻断言。Perl本身是否适合这样的内联断言,或者是否有理由在grep中使用Perl模式而不是本机Perl?我发现的几乎所有内容都是用Perl编写的,就像在脚本或解释器中一样,而不是独立的expression-在这一点上,我可以使用循环、函数和所有东西颠倒遍历字符串。您在
@KevinDuke前面缺少了一个引号:我想我是对的,awk可以处理
&&
d reg exp数学。感谢您查看我的答案。祝大家好运。嗯,我想您的答案是对的哦,前几天我发誓它不起作用。谢谢你的输入!这就像一个符咒,比grep正则表达式更容易阅读(特别是如果你想添加更多匹配或排除的内容)。谢谢!是的,但是您将所有这些塞进单个grep命令的原因通常是为了在tail-f命令中使用,或者其他使用只能通过管道传输到单个命令中的数据流的命令中使用。此解决方案只有在您对上下文不感兴趣的情况下才有效,也就是说,它不能很好地与
-a
-B
-C
grep所具有的选项。这在文件名可能包含字符串
beta
的重要情况下(至少对我来说)也不起作用。
grep "alpha" * | grep -v "beta"