Mog*_*rDK 1 regex validation bash cidr
我似乎无法理解这个问题。我有一个正则表达式,用于检查字符串是否包含有效的 CIDR 表示法地址。
(((?:25[012345]|2[0-4]\d|1?\d\d?)\.){3}(?:25[012345]|2[0-4]\d|1?\d\d?))(?:\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\d])
这个东西可以在 Perl、PHP、Javascript 中运行,并x.x.x.x/8与y.y.y.y/32.
我尝试将它们更改\d为[[:digit:]]Nothing \\d:(
用于测试的测试脚本:
#!/bin/bash
if [ "$1" = "" ]
then
echo "Usage: $( basename $0) 123.456.789.0/12"
exit
fi
REGEX1='(((?:25[012345]|2[0-4]\d|1?\d\d?)\.){3}(?:25[012345]|2[0-4]\d|1?\d\d?))(?:\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\d])'
REGEX2='(((?:25[012345]|2[0-4]\\d|1?\\d\\d?)\.){3}(?:25[012345]|2[0-4]\\d|1?\\d\\d?))(?:\\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\\d])'
REGEX3='(((?:25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?)\\.){3}(?:25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?))(?:\\/([1-9]|[1-2][0-9]|3[0-2]))(?![.[[:digit:]]])'
REGEX=$REGEX3
if [[ $1 =~ $REGEX ]]
then
echo "$1 OK!"
else
echo "$1 Not OK! $REGEX"
fi
Run Code Online (Sandbox Code Playgroud)
有什么想法可以从这里去哪里吗?
更新。添加工作脚本:
#!/bin/bash
if [ "$1" = "" ]
then
echo "Usage: $( basename $0) 123.456.789.0/12"
exit
fi
REGEX='(((25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?))(\/([8-9]|[1-2][0-9]|3[0-2]))([^0-9.]|$)'
if [[ $1 =~ $REGEX ]]
then
echo "$1 OK!"
else
echo "$1 Not OK!"
fi
if echo $1 | grep -Pq $REGEX
then
echo "grep $1 OK!"
else
echo "grep $1 Not OK!"
fi
Run Code Online (Sandbox Code Playgroud)
成功的最短路径是 GNU grep,它也支持 PCRE:
\n#!/bin/sh\n\nif echo "$CIDR" | grep -qP "$REGEX"\nthen\n echo "$CIDR OK!"\n exit 0\nelse\n echo "$CIDR NOT OK!"\n exit 1\nfi\nRun Code Online (Sandbox Code Playgroud)\ngrep-q使其保持沉默并依赖退出代码来确定成功。-P是PCRE。
但我应该指出,您的正则表达式并不完全匹配有效的 CIDR 范围;相反,您匹配的是一个有效的 IP 地址,后跟一个斜杠和一个数字n \xe2\x88\x88 1-32。CIDR 范围的另一个要求是32-n低位为零,例如:
\n#!/bin/sh\n\nvalid_cidr() {\n CIDR="$1"\n\n # Parse "a.b.c.d/n" into five separate variables\n IFS="./" read -r ip1 ip2 ip3 ip4 N <<< "$CIDR"\n\n # Convert IP address from quad notation to integer\n ip=$(($ip1 * 256 ** 3 + $ip2 * 256 ** 2 + $ip3 * 256 + $ip4))\n\n # Remove upper bits and check that all $N lower bits are 0\n if [ $(($ip % 2**(32-$N))) = 0 ]\n then\n return 0 # CIDR OK!\n else\n return 1 # CIDR NOT OK!\n fi\n}\nRun Code Online (Sandbox Code Playgroud)\n127.0.0.0/24使用例如, 127.1.0.0,进行测试127.1.1.0/24。
或者更多奇数范围:10.10.10.8/29, 127.0.0.0/8, 127.3.0.0/10, 192.168.248.0/21。