SSi*_*ilk 19 regex string powershell replace
使用Powershell,我知道如何使用正则表达式搜索文件中的复杂字符串,并用一些固定值替换它,如下面的代码片段所示:
Get-ChildItem "*.txt" |
Foreach-Object {
$c = ($_ | Get-Content)
$c = $c -replace $regexA,'NewText'
[IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
}
Run Code Online (Sandbox Code Playgroud)
现在我想弄清楚如何替换正则表达式的每个匹配的子部分.这可以像上面一样顺利完成吗?或者你是否必须提取较大的正则表达式的每个匹配,在其中搜索和替换,然后以某种方式将结果粘贴回原始文本?
为了澄清一个例子,假设在下面的测试文本中我想在下面的文本中只找到14xx编号的实例,如"TEST =*1404",并用16xx替换14xx?
A 2180 1830 12 0 3 3 TEST=C1404
A 900 1830 12 0 3 3 TEST=R1413
A 400 1830 12 0 3 3 TEST=R1411
A 1090 1970 12 0 3 3 TEST=U1400
A 1090 1970 12 0 3 3 TEST=CSA1400
A 1090 1970 12 0 3 3 TEST=CSA1414
A 1090 1970 12 0 3 3 TEST=CSA140
A 1090 1970 12 0 3 3 TEST=CSA14001
A 1090 1970 12 0 3 3 TEST=CSA17001
Run Code Online (Sandbox Code Playgroud)
即我希望得到的文本如下,你会注意到只有前6行应该改变:
A 2180 1830 12 0 3 3 TEST=C1604
A 900 1830 12 0 3 3 TEST=R1613
A 400 1830 12 0 3 3 TEST=R1611
A 1090 1970 12 0 3 3 TEST=U1600
A 1090 1970 12 0 3 3 TEST=CSA1600
A 1090 1970 12 0 3 3 TEST=CSA1614 <- Second instance of '14' shouldn't change
A 1090 1970 12 0 3 3 TEST=CSA140 <- Shorter numbers shouldn't change
A 1090 1970 12 0 3 3 TEST=CSA14001 <- Longer numbers shouldn't change
A 1090 1970 12 0 3 3 TEST=CSA17001
Run Code Online (Sandbox Code Playgroud)
以下正则表达式似乎可以找到我需要替换的更大字符串,但我不知道Powershell(replace?)中的哪些功能只是用来替换结果的子字符串.此外,如果有帮助,请随意提出更好的正则表达式.
$regexA = "\bTEST=\b[A-Za-z]+14\d\d\r"
Run Code Online (Sandbox Code Playgroud)
我宁愿不必硬编码'='和数字之间可能存在的详尽列表,如'R','C',"CSA"等.
我已经做了一个小时左右的事情,我得到正则表达式的所有匹配,在其中搜索以16替换14,然后在原始文本上使用旧值和新值运行替换,例如replace($myText,"TEST=CSA1400","TEST=CSA1600"),但这是没有很好地掩盖特殊情况,感觉我正在走向兔子洞.
Ans*_*ers 26
您需要对要保留的子表达式进行分组(即将它们放在括号中),然后通过变量$1和$2替换字符串引用组.尝试这样的事情:
$regexA = '( TEST=[A-Za-z]+)14(\d\d)$'
Get-ChildItem '*.txt' | ForEach-Object {
$c = (Get-Content $_.FullName) -replace $regexA, '${1}16$2' -join "`r`n"
[IO.File]::WriteAllText($_.FullName, $c)
}
Run Code Online (Sandbox Code Playgroud)