正则表达式匹配字符串中多次出现的模式

Regex match a pattern occurring multiple times in a string

在 Ubuntu 中使用 grep,我正在尝试正则表达式匹配在一行中重复多次的模式。

示例: 0:0, 80:3, 443:0, 8883:0, 9000:0, 9001:0,

我试过的正则表达式是 -

([0-9]+:[0-9]+, )+

但它最多只能匹配 -

0:0, 80:3, 443:0, 8883:0, 9000:0,

我希望它匹配完整的行。另外,如果正则表达式会检查匹配字符串中是否存在 80443,我将不胜感激。

期望-

应匹配以下行 -

0:0, 80:3, 443:0, 8883:0, 9000:0, 9001:0,
0:0, 80:0, 443:1, 8883:0, 9000:0, 9001:0,
0:0, 80:0, 443:0, 8883:0, 9000:0, 9001:0,
0:0, 80:3, 443:1, 8883:0, 9000:0, 9001:0,

和下面的应该匹配-

0:0, 443:0, 8883:0, 9000:0, 9001:0,
0:0, 80:0, 8883:0, 9000:0, 9001:0,
0:0, 8883:0, 9000:0, 9001:0,

您可以使用

^[0-9]+:[0-9]+, 80:[0-9]+, 443:[0-9]+(, [0-9]+:[0-9]+)+,$

参见regex demo

此外,考虑 awk 解决方案,例如

awk '/^[0-9]+:[0-9]+(, [0-9]+:[0-9]+)+,$/ && /80/ && /443/' file

online demo:

#!/bin/bash
s='0:0, 80:3, 443:0, 8883:0, 9000:0, 9001:0,
0:0, 80:0, 443:1, 8883:0, 9000:0, 9001:0,
0:0, 80:0, 443:0, 8883:0, 9000:0, 9001:0,
0:0, 80:3, 443:1, 8883:0, 9000:0, 9001:0,
0:0, 443:0, 8883:0, 9000:0, 9001:0,
0:0, 80:0, 8883:0, 9000:0, 9001:0,
0:0, 8883:0, 9000:0, 9001:0,'
awk '/^[0-9]+:[0-9]+(, [0-9]+:[0-9]+)+,$/ && /80/ && /443/' <<< "$s"

输出:

0:0, 80:3, 443:0, 8883:0, 9000:0, 9001:0,
0:0, 80:0, 443:1, 8883:0, 9000:0, 9001:0,
0:0, 80:0, 443:0, 8883:0, 9000:0, 9001:0,
0:0, 80:3, 443:1, 8883:0, 9000:0, 9001:0,

这里有更强大的 awk 模式匹配,根据您显示的示例,在 GNU awk 中编写和测试,应该在任何 awk 中工作。 awk 代码的简单解释是:awk 适用于 condition/regexp 然后 action 的方法,所以我在这里提到 condition/regexp 没有任何操作,所以如果正则表达式是真(匹配)然后默认打印行。

awk '/^0:[0-9],[[:space:]]+80:[0-9],[[:space:]]+443:[0-9],[[:space:]]+8883:[0-9](,[[:space:]]+9[0-9]{3}:[0-9]){2},$/' Input_file

说明:为上述正则表达式添加详细说明。

^0:[0-9],[[:space:]]+             ##From starting of line matching 0 followed by colon followed by comma, followed y 0 OR 1 occurrences of space(s).
80:[0-9],[[:space:]]+             ##Above regex is followed by 80 colon any digit comma and space(s).
443:[0-9],[[:space:]]+            ##Above is followed by 443 colon digit comma and space(s).
8883:[0-9]                        ##Above is followed by 8883 followed by colon followed by any digit.
(,[[:space:]]+9[0-9]{3}:[0-9]){2} ##matching comma space(s) followed by 9 which is followed by 3 digits and this whole match 2 times(to match last 2 9000 etc values).
,$                                ##Matching comma at the end of line here.