如何greg regex1或regex2?

时间:2019-03-25 21:25:20

标签: regex bash grep

我想grep(在ubuntu18.04上)每行符合“两个数字中的至少一个大于0”的模式的行。

我找到了有关“ |”的信息正则表达式中的用法,但我发现它在这里不起作用。

一个尝试过的选项:

grep -E "Foo:[1-9]+ | Bar:[1-9]+" input

返回:

Foo:1, Bar:1
Foo:0, Bar:1

这是无效的,因为它仅与Bar:[1-9]+

相匹配

输入数据:

Foo:1, Bar:0
Foo:1, Bar:1
Foo:0, Bar:1
Foo:0, Bar:0
Foo:55, Bar:0

解决方案中的预期结果:

Foo:1, Bar:0
Foo:1, Bar:1
Foo:0, Bar:1
Foo:55, Bar:0

2 个答案:

答案 0 :(得分:6)

问题在于数字后面的空格:您输入的数据中没有这样的空格。

grep -E 'Foo:[1-9]|Bar:[1-9]'

给出预期的输出。

可以进一步简化为

grep -E '(Foo|Bar):[1-9]'

请注意,+是不需要的:以1-9开头的数字已经大于0,即使它后面跟着0或什么也没有。

答案 1 :(得分:0)

choroba提出的 Great 答案的基础上,我们将所有模式组合到一个正则表达式中,还有另外两种方法可以做到这一点,尤其是如果您有很多将它们组合成一个正则表达式的模式可能不是最佳解决方案。

1)使用命令行上的所有模式

grep -e 'Foo:[1-9]\+' -e 'Bar:[1-9]\+' input
Foo:1, Bar:0
Foo:1, Bar:1
Foo:0, Bar:1
Foo:55, Bar:0

(请注意,由于我们使用的是POSIX标准正则表达式,因此必须转义+\+

2)将所有模式重新组合到一个文件中

$ cat patterns 
Foo:[1-9]\+
Bar:[1-9]\+
$ grep -f patterns input
Foo:1, Bar:0
Foo:1, Bar:1
Foo:0, Bar:1
Foo:55, Bar:0

或最终

grep -f <(echo 'Foo:[1-9]\+'; echo 'Bar:[1-9]\+') input

如果您不想拥有文件。

+的相同评论:以1-9开头的数字已经大于0,即使后面跟着0或根本没有。