![](/img/trans.png)
[英]Regex to extract last two octets of IP address (3rd and 4th Octet) in Google Sheets
[英]Change 3rd octet of IP in string format using PowerShell
我想我找到了最糟糕的方法:
$ip = "192.168.13.1"
$a,$b,$c,$d = $ip.Split(".")
[int]$c = $c
$c = $c+1
[string]$c = $c
$newIP = $a+"."+$b+"."+$c+"."+$d
$newIP
但最好的方法是什么? 完成后必须是字符串。 没有考虑验证其合法的IP。
使用你的例子来修改你想要修改第三个八位字节的方法,我会以同样的方式完成它,但我会将一些步骤压缩在一起:
$IP = "192.168.13.1"
$octets = $IP.Split(".") # or $octets = $IP -split "\."
$octets[2] = [string]([int]$octets[2] + 1) # or other manipulation of the third octet
$newIP = $octets -join "."
$newIP
您可以简单地使用PowerShell的-replace运算符和前瞻模式。 请看下面的这个脚本
Set-StrictMode -Version "2.0"
$ErrorActionPreference="Stop"
cls
$ip1 = "192.168.13.123"
$tests=@("192.168.13.123" , "192.168.13.1" , "192.168.13.12")
foreach($test in $tests)
{
$patternRegex="\d{1,3}(?=\.\d{1,3}$)"
$newOctet="420"
$ipNew=$test -replace $patternRegex,$newOctet
$msg="OLD ip={0} NEW ip={1}" -f $test,$ipNew
Write-Host $msg
}
这将产生以下结果:
OLD ip=192.168.13.123 NEW ip=192.168.420.123
OLD ip=192.168.13.1 NEW ip=192.168.420.1
OLD ip=192.168.13.12 NEW ip=192.168.420.12
如何使用-replace运算符?
https://powershell.org/2013/08/regular-expressions-are-a-replaces-best-friend/
理解我使用过的模式
\\ d {1,3}(?=。\\ d {1,3} $)中的(?=)意味着落后。
(?=。\\ d {1,3} $ in \\ d {1,3}(?=。\\ d {1,3} $)表示DOT后面的任何内容和1-3位数字。
前导\\ d {1,3}是专门匹配1-3位数的指令
全部用简单的英语组合“ 给我1-3个数字,这个数字落后于一个时期,1-3个数字位于字符串的右侧边界 ”
正面看正则表达式
更正
正则表达式模式是前瞻性而不是落后 。
如果您有PowerShell Core (v6.1或更高版本),则可以将-replace
与基于脚本块的替换组合使用 :
PS> '192.168.13.1' -replace '(?<=^(\d+\.){2})\d+', { 1 + $_.Value }
192.168.14.1
负面的后置断言(?<=^(\\d+\\.){2})
匹配所有内容,但不包括第三个八位字节 - 而不考虑它是要替换的整体匹配的一部分。
(?<=...)
是后视断言, \\d+
匹配一个或多个( +
)数字( \\d
), \\.
文字 .
,和{2}
匹配前面的子表达式( (...)
)2次。 \\d+
然后匹配第3个八位字节; 因为没有更多匹配,所以字符串( .
和第4个八位字节)的其余部分保留在原位。
在替换脚本块( { ... }
)内, $_
以[MatchInfo]
实例的形式引用匹配的结果; 它的.Value
是匹配的字符串,即第3个八位字节,可以添加1
。
1
,隐式[int]
,作为LHS ,RHS( .Value
字符串 )被隐式强制转换为[int]
(您可以选择使用显式转换)。 如果必须与Windows PowerShell保持兼容,请考虑Jeff Zeitlin的有用答案 。
为了完成您的方法,但很快:
$a,$b,$c,$d = "192.168.13.1".Split(".")
$IP="$a.$b.$([int]$c+1).$d"
function Replace-3rdOctet {
Param(
[string]$GivenIP,
[string]$New3rdOctet
)
$GivenIP -match '(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})' | Out-Null
$Output = "$($matches[1]).$($matches[2]).$New3rdOctet.$($matches[4])"
Return $Output
}
复制到ps1文件并从命令行点源,然后键入
Replace-3rdOctet -GivenIP '100.201.190.150' -New3rdOctet '42'
产量:100.201.42.150
从那里你可以为随机输入等添加额外的错误处理等。
这是一个略有不同的方法。 [ 笑 ]直到我完成这件事之后我才注意到JeffZeitlin的答案。
[编辑 - 感谢JeffZeitlin提醒我OP希望最终结果为字符串。 哎呀! [*脸红*]]
它能做什么 ...
这是代码......
$OriginalIPv4 = '1.1.1.1'
$TargetOctet = 3
$OctetList = [int[]]$OriginalIPv4.Split('.')
$OctetList[$TargetOctet - 1]++
$NewIPv4 = [ipaddress]($OctetList -join '.')
$NewIPv4
'=' * 30
$NewIPv4.IPAddressToString
输出......
Address : 16908545
AddressFamily : InterNetwork
ScopeId :
IsIPv6Multicast : False
IsIPv6LinkLocal : False
IsIPv6SiteLocal : False
IsIPv6Teredo : False
IsIPv4MappedToIPv6 : False
IPAddressToString : 1.1.2.1
==============================
1.1.2.1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.