我试图traceroute
通过正则表达式匹配输出中找到的IP地址.我不是试图验证它们,因为它足够安全以假设traceroute
有效(即不输出类似的东西999.999.999.999
.我正在尝试以下正则表达式:
([0-9]{1,3}.?){4}
Run Code Online (Sandbox Code Playgroud)
我在regex101中测试它,它确实验证了一个IP地址.但是,当我尝试
echo '192.168.1.1 foobar' | grep '([0-9]{1,3}.?){4}'
Run Code Online (Sandbox Code Playgroud)
我一无所获.我错过了什么?
您使用了POSIX ERE模式,但没有通过-E
选项来grep
使用POSIX ERE风格.因此,grep
使用POSIX BRE,您需要转义{n,m}
量词并将(...)
它们解析为特殊的正则表达式运算符.
要使您的模式以.
您希望的方式工作,您可以使用:
grep -E '([0-9]{1,3}\.?){4}' # POSIX ERE
grep '\([0-9]\{1,3\}\.\?\)\{4\}' # POSIX BRE version of the same regex
Run Code Online (Sandbox Code Playgroud)
(注意你需要转义一个,grep
以便它只能匹配一个文字点.)
查看在线演示.
相同正则表达式的POSIX BRE版本:
grep -E '[0-9]{1,3}(\.[0-9]{1,3}){3}' # POSIX ERE
grep '[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}' # POSIX BRE
Run Code Online (Sandbox Code Playgroud)
但是,此正则表达式也将匹配几个数字的字符串,因为它.
是可选的.您可以通过展开模式来解决它
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' # POSIX ERE
Run Code Online (Sandbox Code Playgroud)
或BRE版本:
grep -E '([0-9]{1,3}\.?){4}' # POSIX ERE
grep '\([0-9]\{1,3\}\.\?\)\{4\}' # POSIX BRE version of the same regex
Run Code Online (Sandbox Code Playgroud)
看另一个演示.
基本上,它匹配:
[0-9]{1,3}
- 任何ASCII数字出现1到3次(\.[0-9]{1,3}){3}
- 出现3次:
\.
- 文字 .
[0-9]{1,3}
- 任何ASCII数字出现1到3次 您可以使用单词边界(可以是\<
/ \>
或\b
)等进一步调整它.
实际上,您可能希望使用更精确的IP匹配正则表达式.
归档时间: |
|
查看次数: |
6954 次 |
最近记录: |