Удалить содержимое между двумя строками используя powershell - PullRequest
1 голос
/ 27 апреля 2020

Привет У меня есть блок кода, в котором мне нужно удалить значения, которые присутствуют в массиве, но это необходимо сделать с помощью регулярного выражения, которое я не могу выполнить sh, если кто-нибудь может мне помочь в это будет очень полезно.

Ниже приведен блок кода:

$arr = @("Abd","xyz")

  imports: [
    ddd,
    xxx,
    yyy,
    Abd,
    fff,
    xyz,
    zzz,
    nnn,
  ],

Я хочу сделать sh, что все значения, присутствующие в массиве, должны быть удалены между "импортами" : ["и первый экземпляр"], "

1 Ответ

0 голосов
/ 27 апреля 2020

Полагаю, что-то подобное может сработать для вас:

Для демонстрации я использую 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)
)
...