正则表达式匹配字符串中多次出现的模式
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,
我希望它匹配完整的行。另外,如果正则表达式会检查匹配字符串中是否存在 80
和 443
,我将不胜感激。
期望-
应匹配以下行 -
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
#!/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.
在 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,
我希望它匹配完整的行。另外,如果正则表达式会检查匹配字符串中是否存在 80
和 443
,我将不胜感激。
期望-
应匹配以下行 -
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
#!/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.