Ale*_*hin 5 bash regular-expression
在我的 Python 脚本中,我有一个用于在文件中搜索 IP 地址(如 0.0.0.0-255.255.255.255)的正则表达式,它看起来像这样:
[1-2]{0,1}[0-9]{0,1}[0-9]{1}\.[1-2]{0,1}[0-9]{0,1}[0-9]{1}\.[1-2]{0,1}[0-9]{0,1}[0-9]{1}\.[1-2]{0,1}[0-9]{0,1}[0-9]{1}
Run Code Online (Sandbox Code Playgroud)
现在我需要在 Bash 脚本中使用相同的内容。所以我把它改成这样:
[1-2]\{0,1\}[0-9]\{0,1\}[0-9]\{1\}\.[1-2]\{0,1\}[0-9]\{0,1\}[0-9]\{1\}\.[1-2]\{0,1\}[0-9]\{0,1\}[0-9]\{1\}\.[1-2]\{0,1\}[0-9]\{0,1\}[0-9]\{1\}
Run Code Online (Sandbox Code Playgroud)
几乎可以正常工作,但由于某种原因,它过滤了“1000.0.0”、“2323.23.23.2323”等地址。为什么呢。
小智 8
试图缩短正则表达式,结果如下:
#!/bin/bash
rx='([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])'
for ip in 08.08.08.08 3.3.3.3 11.11.11.11 \
111.123.11.99 \
222.2.3.4 999.88.9.9 \
255.255.255.255 255.0.3.3 0.256.0.222; do
if [[ $ip =~ ^$rx\.$rx\.$rx\.$rx$ ]]; then
echo "valid: "$ip
else
echo "not valid: "$ip
fi
done
Run Code Online (Sandbox Code Playgroud)
我认为这应该涵盖它
$ octet="(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])"
Run Code Online (Sandbox Code Playgroud)
或者避免左侧出现零:
$ octet="(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])"
Run Code Online (Sandbox Code Playgroud)
然后您可以使用$octet
:
$ ip4="^$octet\\.$octet\\.$octet\\.$octet$"
$ echo $ip4
^(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])\.(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])$
$ [[ 123.234.12.34 =~ $ip4 ]] && echo y || echo n
y
$ [[ 123.234.12.345 =~ $ip4 ]] && echo y || echo n
n
Run Code Online (Sandbox Code Playgroud)
regexppython
使用的是来自egrep
70 年代命令的扩展正则表达式语法(尽管该{...}
部分是后来添加的,实际上是在grep
之前添加的egrep
)。
POSIX在 90 年代整合了grep
andegrep
命令(egrep
现在是),并对运算符进行了标准化(这在早期是不可用的)。grep -E
{x,y}
egrep
所以现在,您应该能够grep -E 'that-regexp'
与所有现代grep
实现一起使用。
请注意,您的正则表达式将允许 299.299.299.299 并且{1}
s 是多余的。{0,1}
可以缩短为?
.
请注意,grep
查找与正则表达式匹配的行,即包含与任意位置的正则表达式匹配的字符串的行。使用^
和$
进行锚定,或使用-x
选项 到grep
。
归档时间: |
|
查看次数: |
31711 次 |
最近记录: |