如何在Powershell中实现IPv6零压缩?

1 regex powershell replace ipv6

例如:这是一个IP地址:fc06:0000:0002:0760:e000:7201:7003:06b7.但我想将":0"或:和更多的零替换为":".所以看起来应该是这样的:fc06 :: 2:760:e000:7201:7003:6b7

代码:

if (Test-Path $file){
    foreach ($line in Get-Content $file){
        $line=$line.Replace(":0+",":")
        Write-Output $line 
   }
}
Run Code Online (Sandbox Code Playgroud)

我知道,问题在于:0+.所以:我怎么能说出最后一个角色中的一个或多个(现在:零)?因为简单:0+不起作用.谢谢!

bri*_*ist 5

使用内置[System.Net.IPAddress]类:

$ip = [System.Net.IPAddress]"fc06:0000:0002:0760:e000:7201:7003:06b7"
$ip.IPAddressToString
Run Code Online (Sandbox Code Playgroud)

要么

$ip = [System.Net.IPAddress]::Parse("fc06:0000:0002:0760:e000:7201:7003:06b7")
$ip.IPAddressToString
Run Code Online (Sandbox Code Playgroud)

我建议使用字符串替换,因为它将处理地址不同部分中的多组零问题,从而阻止您创建无效的IPv6地址.它不会崩溃第一个连续的零::.

编辑

实际上,::如果有超过1组连续的零,则此方法将使用,例如:

$ip = [System.Net.IPAddress]::Parse("fc06:0000:0000:0760:e000:7201:0000:06b7")
$ip.IPAddressToString
Run Code Online (Sandbox Code Playgroud)

会给你fc06::760:e000:7201:0:6b7.

编辑2

这是一种准确得到你想要的方法:

$ip = [System.Net.IPAddress]::Parse("fc06:0000:0002:0760:e000:7201:7003:06b7")
$ip.IPAddressToString -replace '(?<!(?:^|:)0?:.*?)(?:^|:)0:','::'
Run Code Online (Sandbox Code Playgroud)

这让班级可以完成繁重的工作,如果有一个可以折叠的零,它会照顾它.

输出: fc06::2:760:e000:7201:7003:6b7

(也测试了在不同位置具有不同大小的零块的其他地址).

编辑3:

正如@Ron Maupin指出的那样,RFC 5952第4.2.2节规定:

符号"::"不得用于缩短一个16位0字段.例如,表示形式2001:db8:0:1:1:1:1:1是正确的,但2001:db8 :: 1:1:1:1:1不正确.

鉴于此,我强烈建议您不要使用编辑2中的代码,否则尝试折叠单个16位字段.

相反,使用内置类的零压缩,它似乎已经符合RFC.