Bash CentOS,将ipV6短格式转换为长格式

Bash CentOS,将ipV6短格式转换为长格式,bash,centos,ipv6,Bash,Centos,Ipv6,我刚刚开始编写bash脚本,有一个小问题需要解决: 我正在获取以下格式的IPv6地址: 1080::8:800:200C:417A 现在我想把短的转换成长的IPv6格式,比如:1080:0:0:8:800:200C:417A 是否有一个正则表达式或类似的东西来转换它 我正在开发一个运行在CentOS上的docker容器。它不是一个正则表达式,但它是“类似的东西”,它完成了这项工作:(使用python3.5.1进行了测试) 参考: 它不是正则表达式,但它是“类似的东西”,它完成了以下任务:(使用p

我刚刚开始编写bash脚本,有一个小问题需要解决:

我正在获取以下格式的IPv6地址:
1080::8:800:200C:417A

现在我想把短的转换成长的IPv6格式,比如:
1080:0:0:8:800:200C:417A

是否有一个正则表达式或类似的东西来转换它


我正在开发一个运行在CentOS上的docker容器。

它不是一个正则表达式,但它是“类似的东西”,它完成了这项工作:(使用python3.5.1进行了测试)

参考:

它不是正则表达式,但它是“类似的东西”,它完成了以下任务:(使用python3.5.1进行测试)

参考:

这是我的ipv6验证代码。您将使用“sipcalc”获得ip的扩展形式。但是您应该执行一些grep和cut命令


这是我的ipv6验证代码。您将使用“sipcalc”获得ip的扩展形式。但是您应该执行一些grep和cut命令。以下是我解压缩ipv6地址的方法

#!/bin/bash

decompress_ipv6_address() {
    # How many hextets are there
    num_hextets=${addr//[^:]/}
    num_hextets=${#num_hextets}

    # Fix up beginning and end
    [[ $addr =~ ^:: ]] && addr='0'$addr
    [[ $addr =~ ::$ ]] && addr=$addr'0'

    # Create additional hextets
    additional_hextets=':'
    for (( i=$num_hextets; $i<8; i++ ))
    do
        additional_hextets=$additional_hextets'0:'
    done

    # Insert additional hextets (replace ::)
    addr=${addr/::/$additional_hextets}
}
#/bin/bash
解压缩\u ipv6\u地址(){
#有多少个六角体
num_hextets=${addr/[^:://}
num#u hextets=${num#u hextets}
#安排起止点
[[$addr=~^::]&&addr='0'$addr
[[$addr=~::$]&&addr=$addr'0'
#创建额外的六角体
附加的_hextets=':'

对于((i=$num_hextets;$i,以下是我解压缩IPv6地址的方法

#!/bin/bash

decompress_ipv6_address() {
    # How many hextets are there
    num_hextets=${addr//[^:]/}
    num_hextets=${#num_hextets}

    # Fix up beginning and end
    [[ $addr =~ ^:: ]] && addr='0'$addr
    [[ $addr =~ ::$ ]] && addr=$addr'0'

    # Create additional hextets
    additional_hextets=':'
    for (( i=$num_hextets; $i<8; i++ ))
    do
        additional_hextets=$additional_hextets'0:'
    done

    # Insert additional hextets (replace ::)
    addr=${addr/::/$additional_hextets}
}
!/bin/bash
解压缩\u ipv6\u地址(){
#有多少个六角体
num_hextets=${addr/[^:://}
num#u hextets=${num#u hextets}
#安排起止点
[[$addr=~^::]&&addr='0'$addr
[[$addr=~::$]&&addr=$addr'0'
#创建额外的六角体
附加的_hextets=':'


为了((i=$num_hextets;$iCentOS 8还没有出来……我怀疑编写一个表达式来进行翻译可能是不可行的。您必须确定缺少多少组,这不是一个简单的练习,然后使用缺少多少组的信息编写替换。在Perl之类的东西中,您可以执行任意(Perl)替换中的代码,可能更接近可行。CentOS 8尚未推出…我的怀疑是,编写单个表达式进行翻译可能不可行。您必须确定缺少多少组,这不是一个简单的练习,然后使用有关缺少多少组的信息编写替换ng.在类似Perl的情况下,您可以在替换中执行任意(Perl)代码,这可能更接近可行。哎哟!正如本文所述,它很好地解释了为什么单独使用正则表达式并不是进行映射的特别好的方法。您有一些有趣的(重要的)在一个大正则表达式的最右边的特殊情况下。对出现的文字FFFF(它不应该也允许FFFF)进行猜测是可行的吗?你没有锚定正则表达式,所以它与字符串中的任何地方相匹配。要规范化数据,不需要使用正则表达式进行替换操作。不过,在显示匹配的正则表达式方面做得很好。ipv6验证有很多测试用例。为了满足这些测试用例,我们需要其他一些方法..我在if语句的开头锚定正则表达式。我们可以将ffff更改为[fF]{4}最右边的是一个很好的例子,在一个大正则表达式的右端有一些有趣的(重要的)特殊情况。(它不应该也允许FFFF吗?)。您没有锚定正则表达式,因此它与字符串中的任何位置都匹配。您还使用了其他内容(
sipcalc
程序)要规范化数据,不需要使用正则表达式进行替换操作。不过,在显示匹配的正则表达式方面做得很好。ipv6验证有很多测试用例。为了满足这些测试用例,我们需要其他一些方法..我在if语句的开头锚定正则表达式。我们可以将ffff更改为[fF]{4}。所以我们可以解决这个问题。。这个reg exp还有很多问题。这不适用于混合IPv6地址。此外,“hextet”将表示六位,因为八位表示八位,或者四位表示四位。您正在处理16位字(十六位)。您会注意到函数名是“decompress\u IPv6\u address”。不是吗“解压缩ipv6\u混合地址”。“计算中的Hextet是16位聚合,或四个半字节。”半字节是4位。“Hextet是ipv6地址中8个块中的每个块的非正式名称。“-混合IPv6地址仍然是有效的IPv6地址,也可以进行压缩。良好的解压缩也会考虑压缩和混合的IPv6地址。16位字是十六进制。十六进制是六位。例如,TCP标志是六进制(六位)在TCP头中。十六进制是6,oct是8,quad是4,但hexadec是16。正确地说,在网络世界中,我们只称它们为单词,IPv6地址是8个单词。你可以把你的一生都花在一些琐碎的小争论上,比如十六进制…但在计算中它仍然被称为十六进制。这个问题特别引用了非混合的compcompressed format改为uncompressed only。这恰好也是我所需要的,所以我提供了。如果此人或其他人需要混合,那么添加它只是一个小改动。没有人声称ipv4映射的ipv6无效。但这并不意味着我们都需要在特定的用例和环境中处理它。这不适用于混合IPv6个地址。另外,“hextet”表示6位,因为八位字节表示8位,四位字节表示4位。您处理的是16位字(十六进制)。您会注意到函数名是“decompress\u ipv6\u address”。而不是“decompress\u ipv6\u mixed\u address”。“hextet在计算中是一个16位聚合,或四位聚合。”
#!/bin/bash

decompress_ipv6_address() {
    # How many hextets are there
    num_hextets=${addr//[^:]/}
    num_hextets=${#num_hextets}

    # Fix up beginning and end
    [[ $addr =~ ^:: ]] && addr='0'$addr
    [[ $addr =~ ::$ ]] && addr=$addr'0'

    # Create additional hextets
    additional_hextets=':'
    for (( i=$num_hextets; $i<8; i++ ))
    do
        additional_hextets=$additional_hextets'0:'
    done

    # Insert additional hextets (replace ::)
    addr=${addr/::/$additional_hextets}
}