我需要能够验证将出现在如下文件中的一组 IP 地址:
IP_SUBNETS=['10.1.111.0','10.2.111.0','10.2.123.0']
我想编写一个正则表达式,允许 n 个 IP 地址,只要它们由“,”分隔并用单引号引起来,并且整个“列表”由方括号打开和关闭。
我已经找到了一些正则表达式的 bash 示例,但我很难找到适用于 busybox 的东西。
到目前为止,这就是我所拥有的:
grep IP_SUBNETS myfile | cut -c 12- | grep '^\[[0-9].'
但我似乎无法正确分组。又名每个子网一组。
编辑1
#!/bin/sh
iplist=['10.112.123.0']
pass="$(echo $iplist | grep -E '^\[(([0-9]{1,3}\.){3}[0-9]{1,3},)*([0-9]{1,3}\.){3}[0-9]{1,3}\]$'"
echo "$pass"
答案1
像这样的东西在这里工作:
busybox grep -E '^\[(([0-9]{1,3}\.){3}[0-9]{1,3},)*([0-9]{1,3}\.){3}[0-9]{1,3}\]$'
(busybox 不是我的默认 grep,因此有“busybox”前缀)。
那应该大多验证你的清单,尽管它并不完美。例如,它会接受300.1.2.4
作为有效的 IP 地址。正则表达式为完全验证四个点分隔的数字是否代表有效的子网起始地址会复杂得多。
分解一下:首先,请注意其中有一部分是重复的。请I
稍等一下。然后您可以看到它为^\[(I,)*I\]$
您提供了以逗号分隔的I
s 列表,整个列表用方括号括起来。如果你再看看是什么,如果你注意到另一个重复的模式,I
那就更简单了。然后...这是四个十进制分隔的八位位组。在 shell 脚本中,您当然可以使用变量从这些更简单的构建块构建模式,这对可读性和可维护性有很大帮助。([0-9]{1,3}\.){3}[0-9]{1,3}
O = [0-9]{1,3}
(O.){1,3}O
我使用以下测试数据进行了测试(预期结果作为注释,实际上不在测试数据文件中):
1.2.3.4 # bad: no brackets
[1.2.3.4] # good
[1.2.3.44] # good
[1.2.3.4 # bad: missing bracket
1.2.3.4] # bad: missing bracket
[1.2.3.4,] # bad: empty item
[1.2.3.4,5.6.7.8] # good
[1.2.3.4,5.6.7.8,] # bad: empty item
[1.2.3.4,5.6.7.E] # bad: E is not a number
[1.2.3.4,,5.6.7.8] # bad: empty item
[1.2.3.1234] # bad: 1234 is more than 3 digits
编辑:你可以使用O = ([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])
- 可能有一种更简单的写法,不确定 - 只取数字 0-255;这会导致更长的模式:
busybox grep -E '^\[((([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5]),)*(([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|[0-1][0-9]{2}|2[0-4][0-9]|25[0-5])\]$'
...这可能值得也可能不值得,具体取决于充分验证它们的重要性。