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+不起作用.谢谢!
使用内置[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.
这是一种准确得到你想要的方法:
$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
(也测试了在不同位置具有不同大小的零块的其他地址).
正如@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.