Полагаю, что-то подобное может сработать для вас:
Для демонстрации я использую Here-String, но в реальной жизни вы бы хотели загрузить его из файла с
$txt = Get-Content -Path 'X:\input.txt' -Raw # read as single string
Код использует регулярное выражение для получения части между 'imports: ['
и ']'
.
Затем он разделяет строки и получает массив строк, которые не соответствуют ничему из массива в переменная $block
. Когда это будет сделано, исходный текстовый блок, найденный в $ match [1] и сохраненный в переменной $toReplace
, будет заменен этими отфильтрованными строками (объединены с новыми строками).
$txt = @"
imports: [
ddd,
xxx,
yyy,
Abd,
fff,
xyz,
zzz,
nnn,
],
"@
$arr = "Abd","xyz"
# join the values from the array with the regex OR operator `|`
$remove = ($arr | ForEach-Object { [regex]::Escape($_) }) -join '|'
# test if we can find the block of text between 'imports: [' and '],'
$txt = if ($txt -match 'imports: \[([^]]+)') {
$toReplace = $matches[1]
$block = $toReplace -split '\r?\n' | Where-Object { $_ -notmatch $remove }
$txt.Replace($toReplace, ($block -join [Environment]::NewLine))
}
# output on screen
$txt
# output back to file
$txt | Set-Content -Path 'X:\output.txt'
Вывод будет be
imports: [
ddd,
xxx,
yyy,
fff,
zzz,
nnn,
],
Regex детали:
imports:\ Match the character string “imports: ” literally (case insensitive)
\[ Match the character “[” literally
( Match the regex below and capture its match into backreference number 1
[^]] Match any character that is NOT a “]”
+ Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)