我正在开发一个脚本,用户提供一个特定的IP地址,我想以某种方式屏蔽这个IP,这样它就不会存储在日志中。我的问题是,当我知道IP的前三个值通常是什么时,我可以很容易地做到这一点;但是,我想避免将这些值存储/硬编码到代码中,如果可能的话。即使前三个我不知道,我也希望能够替换这些值。
示例:
10.11.12.50 would display as XX.XX.XX.50
10.12.11.23 would also display as XX.XX.XX.23
我查找了部分字符串替换,但我发现的问题都没有接近这样做。我尝试过这样的事情:
# This ended up replacing all of the numbers
$tempString = $str -replace '[0-9]', 'X'
我知道我在那里,但我的目标只是只替换前3组数字,基本上每个数字都在'之前。但是我没有能够做到这一点。
我尝试使用PowerShell实现的目标是什么?是否有实现这一目标的最佳实践方法?
答案 0 :(得分:2)
这是 示例,说明如何实现这一目标:
Get-Content 'File.txt' |
ForEach-Object { $_ = $_ -replace '\d{1,3}\.\d{1,3}\.\d{1,3}','xx.xx.xx' }
此示例匹配一个数字1-3次,一个文字句点,并继续该模式,以便它从0-999.0-999.0-999
捕获任何内容并替换为xx.xx.xx
答案 1 :(得分:2)
TheIncorrigible1's helpful answer是解决问题的一种确切方法(仅当连续3个连续.
个1-3位数的组匹配时才会发生替换。)
一个更宽松但更短的解决方案,取代除了最后.
个前缀数字组之外的所有内容:
PS> '10.11.12.50' -replace '.+(?=\.\d+$)', 'XX.XX.XX'
XX.XX.XX.50
(?=\.\d+$)
是一个(正)lookahead assertion((?=...)
)匹配所包含的子表达式(文字.
后跟1个或更多字符串末尾的数字(\d
),但不会捕获作为整体匹配的一部分。
净效果是只有$
捕获的内容 - 在前瞻断言匹配之前之前的所有 - 都被.+
替换。
应用于上面的示例输入字符串'XX.XX.XX'
:
10.11.12.50
匹配(?=\.\d+$)
- 前缀为.
的前缀数字组。
.50
匹配 .+
之前的所有,即.50
。
由于未捕获10.11.12
部分,因此它不包含在替换的中,因此只替换了子串(?=...)
,即使用10.11.12
,结果会产生XX.XX.XX
。