使用PowerShell进行部分字符串替换 问题
我正在编写一个脚本,让用户提供一个特定的IP地址,我想以某种方式屏蔽这个IP,这样它就不会存储在日志中。我的问题是,当我知道IP的前三个值通常是什么时,我可以很容易地做到这一点;但是,我希望尽可能避免将这些值存储/硬编码到代码中。我还希望能够替换这些值,即使我不知道前三个值 示例:使用PowerShell进行部分字符串替换 问题,powershell,replace,Powershell,Replace,我正在编写一个脚本,让用户提供一个特定的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 我已经查找了部分字符串替换,但是我发现的
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实现的目标可能实现吗?有没有实现这一目标的最佳实践方法?以下是一个如何实现这一目标的示例:
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
是解决问题的确切方法(仅当3个连续的
分隔的1-3个数字组匹配时才会发生替换)
一个更宽松但更短的解决方案,它取代了除最后一个带前缀的数字组之外的所有内容:
PS> '10.11.12.50' -replace '.+(?=\.\d+$)', 'XX.XX.XX'
XX.XX.XX.50
(?=\。\d+$)
是一个(正)((?=…)
)匹配封闭的子表达式(一个文本
,后跟字符串($
)末尾的一个或多个数字(\d
),但不会将其作为整体匹配的一部分捕获
净效果是,只有+
捕获的内容(在前瞻断言匹配之前的所有内容)被替换为'XX.XX.XX'
应用于上述示例输入字符串,10.11.12.50
:
匹配末尾的(?=\.\d+$)
-前缀数字组,.50
匹配+
之前的所有内容,即.50
10.11.12
- 由于未捕获
部分,因此它不包含在被替换的内容中,因此被替换的只是子字符串(?=…)
,即10.11.12
,因此产生XX.XX.XX
XX.XX.XX.50
$\u=
放在那里(通常应该避免分配给$\u
,在这种情况下,它也会阻止输出).@mklement0如果要在当前脚本块中重复使用$\uuu
,这是有意的,也可以这样做。我不知道他的用例,但看起来他只是想在他的控制台输出中混淆它,所以我的示例部分适用于他的确切用例。@不可纠正1:明白,但请注意,当您分配给$\uucode>时,这将产生一个编辑器警告(将引擎中的$\uuu
设为只读最终被拒绝,以避免破坏现有代码)。@mklement0读起来非常有趣。总体而言,这是一个不错的决定,有点像遗留代码。@Brandon:正确;我再次更新了答案,以用一个具体的例子解释它。