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

4si2a6ki  于 2022-12-12  发布在  Unix
关注(0)|答案(7)|浏览(187)

我需要一个unix grep的单遍正则表达式,它包含,比如说alpha,但不包含beta。

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

carvr3hs1#

这里的其他答案显示了一些方法,你可以扭曲不同的regex来实现这一点,尽管我认为答案通常是,“don't do that”。这样的正则表达式比使用任何语言的布尔逻辑组合两个正则表达式要难读得多,执行起来可能也慢得多。如果您'如果在unix shell提示符下使用grep命令,只需将一个命令的结果通过管道传输到另一个命令即可:

grep "alpha" | grep -v "beta"

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

ycl3bljg

ycl3bljg2#

既然我们都在张贴答案,这里是awk ;- )

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

我希望这能帮上忙。

jtoj6r0c

jtoj6r0c3#

我想^((?!beta).)*alpha((?!beta).)*$就可以了。

cnjp1d6j

cnjp1d6j4#

我很确定这在真正的正则表达式中是不可能的。[^y]*x[^y]*示例将匹配yxy,因为 * 允许零个或多个非y匹配。
编辑:
实际上,这似乎行得通:^[^y]*x[^y]*$。它的基本意思是“匹配以零个或多个非y字符开始、然后具有x、然后以零个或多个非y字符结束的任何行”。

oprakyz7

oprakyz75#

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

jvidinwx

jvidinwx6#

问:如果y是目录,如何在grep中不使用管道匹配x而不是y

A:grep x --exclude-dir='y'

wxclj1h5

wxclj1h57#

最简单的解决方案:

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

请注意空格和双引号。

相关问题