我只想使用Powershell替换字符串的某些字符

时间:2019-07-16 13:22:24

标签: string powershell networking replace scripting

我正在编写一个Powershell脚本,该脚本使用ip地址生成网络地址(10.12.142.1210.12.142.0)。我将要处理的所有ip地址都遵循以下格式{{1} }

我尝试使用String.Replace() method。直到IP地址类似于以下10.xxx.xxx.1210.12.154.12为止,它一直有效。它抓取并替换所有10.214.126.12。 Ive还尝试了一些正则表达式,但无法提供仅与最后一个八位位组匹配的表达式。

.12

我想要$ipAddress = "10.12.23.12" $networkNumber = $ipAddress.replace(".12",".0") ,但我得到10.12.23.0

4 个答案:

答案 0 :(得分:4)

或者使用.String.Remove()从最后一个String.LastIndexOf()中删除所有内容,然后添加.0

$ipAddress = "10.12.23.12"
$network = $ipAddress.Remove($ipAddress.LastIndexOf('.')) + '.0'

或使用仅替换字符串末尾的.12 的正则表达式:

$ipAddress = "10.12.23.12"
$network = $ipAddress -replace '\.\d{1,3}$','.0'

这两个选项都可以在最后一个八位位组中使用任何值,而不仅仅是.12

答案 1 :(得分:3)

您可以在字符串上使用SplitJoin方法:

$ipAddress = "10.12.23.12"
$parts = $ipAddress.Split(".")
$parts[3] = "0"
$networkNumber = [String]::Join(".", $parts)

答案 2 :(得分:1)

另一种选择是提取包含.Substring()的最后一个LastIndexOf()之前的子字符串,然后包括0

PS C:\> $ipAddress = "10.12.23.12"                                                              
PS C:\> $ipAddress.Substring(0, $ipAddress.LastIndexOf('.') + 1) + '0'
10.12.23.0

答案 3 :(得分:1)

这可能是矫kill过正,但是由于网络地址与子网掩码直接相关,因此此功能会将其考虑在内。

Function Get-NetAddress {
    param($IPAddress,$SubnetMask)

    $IPArray = $IPAddress -split "\."
    $MaskArray = $SubnetMask -split "\."
    $output = for ($i = 0; $i -lt 4; $i++) {
        $IPArray[$i] -band $MaskArray[$i]
    }
    $output -join "."
}

输出样本:

Get-NetAddress 192.168.7.1 255.255.248.0
192.168.0.0

Get-NetAddress 10.20.30.40 255.255.0.0
10.20.0.0

Get-NetAddress 10.20.30.250 255.255.255.0
10.20.30.0

Get-NetAddress 10.20.30.171 255.255.255.224
10.20.30.160