Regex 为什么此开关要删除额外的行(PowerShell)
这段代码应该用正则表达式查找一行,并用“test”替换该行。它会找到那一行并用“test”替换它,但也会删除它下面的行,不管下一行是什么。我觉得我只是缺少了一些关于PowerShell中交换机如何工作的信息 注意:这是一个超级精简的代码。这是一个更大的计划的一部分Regex 为什么此开关要删除额外的行(PowerShell),regex,powershell,Regex,Powershell,这段代码应该用正则表达式查找一行,并用“test”替换该行。它会找到那一行并用“test”替换它,但也会删除它下面的行,不管下一行是什么。我觉得我只是缺少了一些关于PowerShell中交换机如何工作的信息 注意:这是一个超级精简的代码。这是一个更大的计划的一部分 $reg = '^HI\*BH' $appendText = '' $file = Get-ChildItem (join-path $PSScriptRoot "a.txt.BAK") foreach (
$reg = '^HI\*BH'
$appendText = ''
$file = Get-ChildItem (join-path $PSScriptRoot "a.txt.BAK")
foreach ($f in $file){
switch -regex -file $f {
$reg
{
$appendText = "test"
}
default {
If ($appendText -eq '') {$appendText = $_}
$appendText
$appendText = ''
}
}
}
a、 txt.BAK
HI*BH>00>D8>0*BH>00>D8>0*BH>A1>D8>0*BH>B1>D8>0000000~
HI*BE>02>>>0.00*BE>00>>>0.00~
NM1*71*1*TTT*NAME****XX*0000000~
PRV*AT*PXC*000V00000X~
输出:
test
NM1*71*1*TTT*NAME****XX*0000000~
PRV*AT*PXC*000V00000X~
开关没有“删除”任何内容-但您明确要求它在匹配时覆盖$appendText
,并且您只有在它没有输出时才输出(并重置)$appendText
的值
这段代码应该用正则表达式查找一行,并用“test”替换该行
在这种情况下,我建议您简化开关
:
switch -regex -file $f {
$reg {
"test"
}
default {
$_
}
}
就是这样-不要摆弄变量-只要在匹配时输出“test”,否则就按原样输出行
如果坚持使用中间变量,则在两种情况下都需要输出+重置值:
switch -regex -file $f {
$reg {
$appendText = "test"
$appendText
$appendText = ''
}
default {
$appendText = $_
$appendText
$appendText = ''
}
}
遵循你要做的事情的逻辑以及为什么很难做到。这通常是一个指示方法错误的指标。在你的位置上,我会重新考虑我的方法。它不会“删除”任何东西-你覆盖
$appendText
(来自上一次迭代)的现有值,而不输出itI。我有这样的程序,因为它实际上是一个更大的程序,我将其归结为这个问题。一段时间都是这样reason@ryankennedy712恐怕我看不懂头脑:-)我已经更新了我的答案简单的选项应该是所有需要的,即使它是部分文本替换+1为清晰简单的示例。