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

Wil*_*ess 47 regex unix grep regex-negation

我需要一个包含unix grep的单行正则表达式,包括alpha,但不包含beta.

grep 'alpha' <> | grep -v 'beta'
Run Code Online (Sandbox Code Playgroud)

noh*_*hat 41

其他答案在这里表现出一定的方法可以扭曲不同品种的正则表达式来做到这一点,但我认为它会证明,答案是,在一般情况下,"不这样做".执行这些正则表达式比使用您使用的任何语言的布尔逻辑组合两个正则表达式要难得多,执行速度可能更慢.如果您grep在unix shell提示符下使用该命令,只需将一个结果传递给另一个:

grep "alpha" | grep -v "beta"
Run Code Online (Sandbox Code Playgroud)

我一直用这种结构来减少过多的结果grep.如果你知道哪个结果集会更小,那么首先将它放在管道中以获得最佳性能,因为第二个命令只需处理第一个输入而不是整个输入.

  • 这个解决方案只有在你对上下文不感兴趣时​​才有效,即它不适用于`gre``所具有的`-A`,`-B`和`-C`选项. (9认同)
  • 是的,但是您将所有这些都塞进单个 grep 命令的原因通常是用于 tail -f 命令或其他使用只能通过管道传输到单个命令的数据流的命令。 (2认同)

she*_*ter 29

好吧,因为我们都发布了答案,这里是awk ;-)

awk '/x/ && !/y/' infile
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

  • @KevinDuke:我认为我是对的,awk可以处理&amp;&amp; d reg-exp数学。感谢您查看我的回答。祝你们好运。 (2认同)

Mr4*_*r47 19

^((?!beta).)*alpha((?!beta).)*$ 我会想到这个伎俩.

  • 这是一个PCRE(Perl兼容的正则表达式),所以你需要GNU Grep的-P选项.(?!...)事物是零宽度负前瞻断言.我建议`perldoc perlre`来解释前瞻断言. (4认同)
  • 你能解释'('s'和'?'在这里工作怎么样?我很困惑,为什么你有2'('在开头'. (3认同)