【发布时间】:2016-12-07 04:53:13
【问题描述】:
tl;博士 在这些情况下,如何使用正则表达式将单词 secret 替换为 ********:
Password="secret"
PWD="secret"
-P secret -i args
我正在尝试制作一个正则表达式,它将检测字符串中的密码并将其替换为 *(在日志记录函数中)。
我目前有这个 Powershell 功能:
function ScrubPasswords {
param(
[string]$DirtyText
)
# match any case of password="" (or PWD="") (or -P .*)
$PwdArgRegex=[regex]'(([Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd]|PWD)=)("[^"]+")'
$PwdArgRegex.replace($DirtyText,'$1********')
}
效果很好,它将引号之间的密码替换为 8 个 *。
但我发现另一个标识密码的字符串即将到来。对于 sqlcmd.exe,参数列表是 -U 用户名 -P 密码,我想从那里清除密码。
我尝试将 |(-P\s([^\s]+)\s) 添加到正则表达式,但它用 * 替换了整个匹配字符串(-P thispassword -i otherargs 变为 ***** ***-i otherargs;不必要地去掉 -P\s 和尾随 \s)。
我正在https://regex101.com/ 进行正则表达式设计/测试,然后当我有看起来不错的东西时,我通过 Powershell_ISE 运行它。
我认为我遇到的问题是我在第二个 OR“|”的两侧有不同数量的组。我将继续摆弄括号,看看我是否可以让匹配组在两边都匹配。
我需要一些帮助来解决这个问题,或者也许有更好的方法来实现我的目标。
这是我迄今为止的最大努力:
((([Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd]|PWD)=)("[^"]+")|(-P\s([^\s]+)\s))
有了这些结果:
Match 1
Full match 23-38 `-P @@@sapwd@@@ `
Group 1. 23-38 `-P @@@sapwd@@@ `
Group 2. 787-787 ``
Group 3. 787-787 ``
Group 4. 787-787 ``
Group 5. 23-38 `-P @@@sapwd@@@ `
Group 6. 26-37 `@@@sapwd@@@`
Match 2
Full match 235-250 `-P @@@sapwd@@@ `
Group 1. 235-250 `-P @@@sapwd@@@ `
Group 2. 787-787 ``
Group 3. 787-787 ``
Group 4. 787-787 ``
Group 5. 235-250 `-P @@@sapwd@@@ `
Group 6. 238-249 `@@@sapwd@@@`
Match 3
Full match 459-487 `Password="@@@NMApassword@@@"`
Group 1. 459-487 `Password="@@@NMApassword@@@"`
Group 2. 459-468 `Password=`
Group 3. 459-467 `Password`
Group 4. 468-487 `"@@@NMApassword@@@"`
Group 5. 787-787 ``
Group 6. 787-787 ``
Match 4
Full match 652-669 `PWD="@@@SAPWD@@@"`
Group 1. 652-669 `PWD="@@@SAPWD@@@"`
Group 2. 652-656 `PWD=`
Group 3. 652-655 `PWD`
Group 4. 656-669 `"@@@SAPWD@@@"`
Group 5. 787-787 ``
Group 6. 787-787 ``
使用此测试数据:
=begin data=
Result of sqlcmd -U sa -P @@@sapwd@@@ -i C:\scripts\BridgepointScriptingLibrary\tmp\StandupScripts\common\000_SQLServer_Post_Install_Script.sql = Changed database context to 'master'. (5 rows affected)
Preparing to run sqlcmd -U sa -P @@@sapwd@@@ -i 000_SQLServer_Post_Install_Script.sql.
Auth User="@@@NMAusername@@@" Password="@@@NMApassword@@@"
PathFromBinRoot="SQL Server 2008 R2 SP1 (x64bit).exe" PWD="@@@SAPWD@@@"
=end data=
【问题讨论】:
-
看起来您的正则表达式匹配。也许替换应该是:
$DirtyText.replace($1,'*********');但我真的不知道 Powershell。
标签: regex powershell