Regex 为什么此开关要删除额外的行(PowerShell)

Regex 为什么此开关要删除额外的行(PowerShell),regex,powershell,Regex,Powershell,这段代码应该用正则表达式查找一行,并用“test”替换该行。它会找到那一行并用“test”替换它,但也会删除它下面的行,不管下一行是什么。我觉得我只是缺少了一些关于PowerShell中交换机如何工作的信息 注意:这是一个超级精简的代码。这是一个更大的计划的一部分 $reg = '^HI\*BH' $appendText = '' $file = Get-ChildItem (join-path $PSScriptRoot "a.txt.BAK") foreach (

这段代码应该用正则表达式查找一行,并用“test”替换该行。它会找到那一行并用“test”替换它,但也会删除它下面的行,不管下一行是什么。我觉得我只是缺少了一些关于PowerShell中交换机如何工作的信息

注意:这是一个超级精简的代码。这是一个更大的计划的一部分

$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为清晰简单的示例。