我尝试使用正则表达式来匹配和替换文件中的文本。我也使用捕获组。在替换文本中,我使用了我想要扩展的捕获组和其他变量。问题是,当其他变量'值以它们扩展的数字开头,我假设它们正在尝试扩展为不存在的捕获组。
以下是替换
之前的文字merchantId="101"
以下是替换后的文本,使用101作为Read-Host命令的输入。
$1101"
并使用它来匹配和替换文本
$merchant = Read-Host 'What merchant would you like to use?'
$configPath = '..\src\config.cfg'
(Get-Content $configPath) | ForEach-Object {
$_ -replace "(merchantId="").*("")\s*$", "`$1$merchant`$2"
}
商家总是一个数字,所以当用户为商家输入101这样的东西时,替换文本看起来像是扩展到1101美元,所以我认为powershell正在寻找第1101个被捕获的组,当然这不是& #39; t存在。
我是powerhsell的新手,语法对我来说有点奇怪,不知道该怎么做。
答案 0 :(得分:1)
你的假设是正确的。不确定PowerShell或正则表达式引擎是否有错,但它正在尝试查找不存在的捕获组。当发生这种情况时,返回字符串文字。如果您的$merchant
按字母顺序排列,则不会出现此问题。
一个简单的解决方案是PetSerAl提供的解决方案。它区分了变量和捕获组。
$_ -replace "(merchantId="").*("")\s*$", "`${1}$merchant`$2"
然而,你真的不需要按照自己的方式去做。既然你只是完全取代价值而不关心以前的价值,为什么不直接覆盖?
(Get-Content $configPath) | ForEach-Object {
If($_ -match "^merchantId="){
'merchantId="{0}"' -f $merchant
} else {
$_
}
}
不是最漂亮的代码,但它有效。