我想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
答案 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
或根本没有。