2014-12-06 74 views
0

我必须在shell和PowerShell中尽可能缩短ipv6地址。在shell和PowerShell中缩短IPV6地址

像:

Input: 2001:0db8:03cd:0000:0000:ef45:0006:
Output: 2001:db8:3cd:::ef45:6:123 

和脚本应该给其自身的描述,如果使用-help参数,但我不知道该怎么做在PowerShell中。

这是我在PowerShell代码,它正确地缩短地址:

param([parameter(Mandatory=$true)]$file) 

if (test-path $file){ 
    foreach ($ip in Get-Content $file){ 
     $ip=$ip.Replace("0000","") 
     Write-Host $ip 

} 
} 

我不知道该怎么做壳的缩短,我想这样的,但没有奏效:

#!/bin/sh 

if [ $1 = "-help" ] 
then 
echo description 

else file = $1 
fi 

for ip in `cat ipv6.txt` 
do 
    $ip=$line 
    $replace="" 
    $echo ${var//0000/$replace} 
done 

这是地址txt文件: http://uptobox.com/6woujdvdfkmh

+0

我怀疑三重结肠不是一个正确的缩短。 '03cd:0000:0000:ef'会变成'3cd :: ef',不是吗?而且你的代码会错误地缩短地址的两个独立的四个零('2001:0db8:0000:0000:004f:0000:0000:0123')集合,因为双冒号只能在缩短的地址中出现一次。 – TessellatingHeckler 2014-12-06 23:43:09

回答

1

我们可能会去同一所学校。这是我被告知要做的,它完美的作品:

cat filename | sed -e 's/:0*/:/g' filename 
1

的PowerShell的好处是,你有机会获得有我一个丰富的库为你做这件事。试试这个:

<# 
.SYNOPSIS 
    Converts long form IP address into its short form 
.DESCRIPTION 
    Converts long form IP address into its short form 
.PARAMETER IPAddress 
    The IP address to convert. 
.EXAMPLE 
    PS C:\> ConvertTo-IPAddressCompressedForm 2001:0db8:03cd:0000:0000:ef45:0006:
#> 
function ConvertTo-IPAddressCompressedForm($IPAddress) { 
    [System.Net.IPAddress]::Parse($IPAddress).IPAddressToString 
} 

C:\> ConvertTo-IPAddressCompressedForm 2001:0db8:03cd:0000:0000:ef45:0006:
2001:db8:3cd::ef45:6:123 

注意,基于文档注释中得到使用PowerShell中:

ConvertTo-IPAddressCompressedForm -? 
+0

谢谢你这个作品,但我必须以某种方式在shell中这样做。 – Grekton 2014-12-07 00:03:52

+0

哪个外壳?您使用PowerShell标记了您的问题,您可以在PowerShell中执行上述操作,如我所示。你能澄清你的意思吗?'也必须在壳上做这个'? – 2014-12-07 01:05:00

+0

哦,我明白了。我在想'shell'标签只是对shell的通用引用。但是你希望在UNIX中工作 - 不是csh,korn shell或Bash,而是sh。也许有人熟悉sh可以回答你的问题。 – 2014-12-07 01:16:29