Почему этот переключатель удаляет дополнительную строку (PowerShell)

#regex #powershell

Вопрос:

Предполагается, что этот код должен найти строку с регулярным выражением и заменить ее на «тест». Это поиск этой строки и замена ее на «тест», но также удаление строки под ней, независимо от того, что находится в следующей строке ниже. Я чувствую, что мне просто чего-то не хватает в том, как работает переключатель в 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~
 

Комментарии:

1. Следовать логике того, что вы пытаетесь сделать и почему, сложно. Обычно это показатель того, что подход неверен. На вашем месте я бы пересмотрел свой подход.

2. Это ничего не «удаляет» — вы перезаписываете существующее значение $appendText (из предыдущей итерации), даже не выводя его

Ответ №1:

Переключатель ничего не «удаляет», но вы явно просите его перезаписать $appendText при совпадении, и вы всегда выводите (и сбрасываете значение) $appendText только тогда, когда это не так.

Предполагается, что этот код должен найти строку с регулярным выражением и заменить ее на «тест».

В таком случае я предлагаю вам упростить свой switch :

 switch -regex -file $f {
    $reg {
        "test"
    }
    default {
        $_
    }
}
 

Вот и все — не возитесь с переменными — просто выведите «тест» на соответствие, в противном случае выведите строку как есть.


Если вы настаиваете на использовании промежуточной переменной, вам нужно будет вывести сбросить значение в обоих случаях:

 switch -regex -file $f {
    $reg {
        $appendText = "test"
        $appendText
        $appendText = ''
    }
    default {
        $appendText = $_
        $appendText
        $appendText = ''
    }
}
 

Комментарии:

1. У меня есть такая программа, потому что на самом деле это гораздо более масштабная программа, которую я свел к этой проблеме. это так по какой-то причине

2. @ryankennedy712 Боюсь, я не умею читать мысли 🙂 Я обновил свой ответ

3. Простой вариант должен быть всем, что требуется, даже если это частичная замена текста. 1 для чистого и простого примера.