首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Powershell中实现IPv6零压缩?

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

Stack Overflow用户
提问于 2014-12-04 05:49:23
回答 2查看 218关注 0票数 1

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

代码:

代码语言:javascript
复制
if (Test-Path $file){
    foreach ($line in Get-Content $file){
        $line=$line.Replace(":0+",":")
        Write-Output $line 
   }
}

我知道,问题出在:0+。那么:我怎么说,最后一个字符中的一个或多个(现在:零)?因为简单的:0+是行不通的。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-12-04 06:04:12

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

代码语言:javascript
复制
$ip = [System.Net.IPAddress]"fc06:0000:0002:0760:e000:7201:7003:06b7"
$ip.IPAddressToString

代码语言:javascript
复制
$ip = [System.Net.IPAddress]::Parse("fc06:0000:0002:0760:e000:7201:7003:06b7")
$ip.IPAddressToString

我推荐使用这种方法而不是使用字符串替换,因为它将处理地址不同部分的多组零的问题,从而防止您创建无效的IPv6地址。但是,它不会将第一个连续的0折叠成::

编辑

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

代码语言:javascript
复制
$ip = [System.Net.IPAddress]::Parse("fc06:0000:0000:0760:e000:7201:0000:06b7")
$ip.IPAddressToString

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

编辑2

下面是一种获得你想要的东西的方法:

代码语言:javascript
复制
$ip = [System.Net.IPAddress]::Parse("fc06:0000:0002:0760:e000:7201:7003:06b7")
$ip.IPAddressToString -replace '(?<!(?:^|:)0?:.*?)(?:^|:)0:','::'

这让类来做繁重的工作,如果有一个可能崩溃的零,它会处理它。

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

(也使用在不同位置具有不同大小的零块的其他地址进行测试)。

编辑3:

正如@Ron Maupin指出的那样,RFC 5952 section 4.2.2声明:

符号"::“不能用来缩短一个16位的0字段。例如,表示2001:db8:0:1:1:1:1:1 :1:1:1:1:1正确,但2001:db8::1:1:1:1:1 :1不正确。

鉴于此,我强烈建议您不要使用编辑2中的代码,或者尝试折叠单个16位字段。I强烈建议您不要使用Edit2中的代码,或者尝试折叠单个16位字段。

取而代之的是,使用内置类的零压缩,它似乎已经符合RFC。

票数 5
EN

Stack Overflow用户

发布于 2014-12-04 05:55:45

string .replace()方法使用文字字符串参数,而不是正则表达式。

切换到-replace操作符:

代码语言:javascript
复制
$line=$line -Replace ':0+',':'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27282335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档