#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 для чистого и простого примера.