我需要一个unix grep的单遍正则表达式,它包含,比如说alpha,但不包含beta。
grep 'alpha' <> | grep -v 'beta'
carvr3hs1#
这里的其他答案显示了一些方法,你可以扭曲不同的regex来实现这一点,尽管我认为答案通常是,“don't do that”。这样的正则表达式比使用任何语言的布尔逻辑组合两个正则表达式要难读得多,执行起来可能也慢得多。如果您'如果在unix shell提示符下使用grep命令,只需将一个命令的结果通过管道传输到另一个命令即可:
grep
grep "alpha" | grep -v "beta"
我一直使用这种结构来筛选grep中过多的结果。如果您知道哪个结果集会更小,请将其放在管道的第一位以获得最佳性能,因为第二个命令只需处理第一个结果集的输出,而不是整个输入。
ycl3bljg2#
既然我们都在张贴答案,这里是awk ;- )
awk '/x/ && !/y/' infile
我希望这能帮上忙。
jtoj6r0c3#
我想^((?!beta).)*alpha((?!beta).)*$就可以了。
^((?!beta).)*alpha((?!beta).)*$
cnjp1d6j4#
我很确定这在真正的正则表达式中是不可能的。[^y]*x[^y]*示例将匹配yxy,因为 * 允许零个或多个非y匹配。编辑:实际上,这似乎行得通:^[^y]*x[^y]*$。它的基本意思是“匹配以零个或多个非y字符开始、然后具有x、然后以零个或多个非y字符结束的任何行”。
[^y]*x[^y]*
^[^y]*x[^y]*$
oprakyz75#
尝试使用excludes运算符:[^y]*x[^y]*
jvidinwx6#
y
x
A:grep x --exclude-dir='y'
grep x --exclude-dir='y'
wxclj1h57#
最简单的解决方案:
grep "alpha" * | grep -v "beta"
请注意空格和双引号。
7条答案
按热度按时间carvr3hs1#
这里的其他答案显示了一些方法,你可以扭曲不同的regex来实现这一点,尽管我认为答案通常是,“don't do that”。这样的正则表达式比使用任何语言的布尔逻辑组合两个正则表达式要难读得多,执行起来可能也慢得多。如果您'如果在unix shell提示符下使用
grep
命令,只需将一个命令的结果通过管道传输到另一个命令即可:我一直使用这种结构来筛选
grep
中过多的结果。如果您知道哪个结果集会更小,请将其放在管道的第一位以获得最佳性能,因为第二个命令只需处理第一个结果集的输出,而不是整个输入。ycl3bljg2#
既然我们都在张贴答案,这里是awk ;- )
我希望这能帮上忙。
jtoj6r0c3#
我想
^((?!beta).)*alpha((?!beta).)*$
就可以了。cnjp1d6j4#
我很确定这在真正的正则表达式中是不可能的。
[^y]*x[^y]*
示例将匹配yxy,因为 * 允许零个或多个非y匹配。编辑:
实际上,这似乎行得通:
^[^y]*x[^y]*$
。它的基本意思是“匹配以零个或多个非y字符开始、然后具有x、然后以零个或多个非y字符结束的任何行”。oprakyz75#
尝试使用excludes运算符:
[^y]*x[^y]*
jvidinwx6#
问:如果
y
是目录,如何在grep中不使用管道匹配x
而不是y
A:
grep x --exclude-dir='y'
wxclj1h57#
最简单的解决方案:
请注意空格和双引号。