我有一个基本的IP正则表达式,用于检查ip是否在0.0.0.0到255.255.255.255之间。当我进入
grep -E "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}" file.txt
它匹配总共12个ip地址(这对我的文本文件是正确的)但只突出显示前3个八位字节,当我需要它突出显示第4个八位字节时。但改变它" {4}"显示没有匹配。
grep -E "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}" file.txt
我的简单问题是为什么不使用{4}
突出显示完整的4个八位字节作为匹配?
答案 0 :(得分:4)
它与第四个八位字节不匹配,因为表达式匹配八位字节,然后.
正好匹配3次。由于第4个八位字节后没有.
,因此不匹配,也不会突出显示。
您可以使用
grep -E "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.?){4}"
此处,\.?
匹配1或0 .
个字符(即.
是可选的,因此第4个八位字节现在将匹配并将突出显示。)
或者,更精确的模式也可以:
grep -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}"
它将匹配并突出显示整个IP地址字符串。
您可以根据自己的要求为模式添加锚点或单词边界。例如。这是一个单词边界模式变化:
grep -E "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}\b"