Regex 如何在命令行管道中匹配IPv6地址

Regex 如何在命令行管道中匹配IPv6地址,regex,grep,command-line-interface,ipv6,Regex,Grep,Command Line Interface,Ipv6,如何生成在其stdin中查找IPv6地址的shell命令 一种选择是使用: grep -Po '(?<![[:alnum:]]|[[:alnum:]]:)(?:(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}|(?:[a-f0-9]{1,4}:){1,6}:(?:[a-f0-9]{1,4}:){0,5}[a-f0-9]{1,4})(?![[:alnum:]]:?)' grep-Po'(?因为我找不到使用shell脚本命令的简单方法,所以我用Python创建了自己的脚本

如何生成在其stdin中查找IPv6地址的shell命令

一种选择是使用:

grep -Po '(?<![[:alnum:]]|[[:alnum:]]:)(?:(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}|(?:[a-f0-9]{1,4}:){1,6}:(?:[a-f0-9]{1,4}:){0,5}[a-f0-9]{1,4})(?![[:alnum:]]:?)'

grep-Po'(?因为我找不到使用shell脚本命令的简单方法,所以我用Python创建了自己的脚本:

!/usr/bin/env python
#将stdin中所有格式正确的IPv6地址打印到stdout。IPv6地址不应重叠或相邻。
导入系统
进口稀土
#向后看/向前看以防止匹配,例如2a00:cd8:d47b:bcdf:f180:132b:8c49:a382:bcdf:f180
regex=re.compile(r''

(?你真的需要向前看和向后看吗?看起来语法基本上是:“8组16位数字,使用十六进制数字时用冒号(:)分隔,如果使用十进制数字,则用点(.)分隔,值为0的并发组可能会折叠为一个双冒号(::)”.我说基本上这很简单,但显然它变得非常快。但我注意到的唯一真正的问题是十六进制和十进制的合法混合。前/后处理是为了防止匹配超过8个组,这显然不是一个格式良好的ip6地址。我想你的总结是正确的。十六进制组最多可以有四个字符这个答案找不到使用十进制表示法的地址。