PowerShell заменяет текст в строке после определенного выражения

#powershell

Вопрос:

Я пытаюсь заменить все в строке после того, как найдено определенное выражение: в данном случае», =dc».

Я вроде как новичок в PowerShell, поэтому был бы признателен за любую помощь. Мой код заменяет только «,=dc», но не то, что за этим стоит

 $array  = @()
$array  = "vu=doc,vu=noc,dc=zet,dc=zez"
$array  = "vu=doc,vu=nud,dc=gut,dc=zrt"
$array  = "vu=doc,vu=nud,vu=dit,dc=gut,dc=zrt,dc=opt"

foreach ($value in $array){
$arraytype -replace "(?<=(,=dc)).*"
}
 

Я хочу вернуть только часть «vu=doc,vu=noc». Все, что после первого», =dc», должно быть удалено.

Ответ №1:

Проще использовать индексированный цикл, если вы хотите, чтобы значения в массиве обновлялись. Кроме того, вы можете определить массив, просто поставив запятую между элементами. Избегайте объединения = , так как это означает, что каждый раз весь массив необходимо воссоздавать в памяти, что отнимает много времени и памяти.

Попробуй

 $array = "vu=doc,vu=noc,dc=zet,dc=zez",
         "vu=doc,vu=nud,dc=gut,dc=zrt",
         "vu=doc,vu=nud,vu=dit,dc=gut,dc=zrt,dc=opt"

for ($i = 0; $i -lt $array.Count; $i  ) {
    $array[$i] = ($array[$i] -replace 'dc=[^,] ,?').TrimEnd(",")
}

$array
 

Результат:

 vu=doc,vu=noc
vu=doc,vu=nud
vu=doc,vu=nud,vu=dit
 

Сведения о регулярном выражении:

 dc=       Match the character string “dc=” literally (case insensitive)
[^,]      Match any character that is NOT a “,”
          Between one and unlimited times, as many times as possible, giving back as needed (greedy)
,         Match the character “,” literally
   ?      Between zero and one times, as many times as possible, giving back as needed (greedy)
 

Ответ №2:

Вы можете использовать IndexOf метод, чтобы найти положение строки, и использовать Substring метод, чтобы разрезать строку до этой позиции.

 $array = @()
$array  = "vu=doc,vu=noc,dc=zet,dc=zez"
$array  = "vu=doc,vu=nud,dc=gut,dc=zrt"
$array  = "vu=doc,vu=nud,vu=dit,dc=gut,dc=zrt,dc=opt"

foreach ($value in $array){
    $index = $value.IndexOf(",dc=")
    if($index -eq -1) {
        Write-Output $value
    } else {
        Write-Output $value.Substring(0, $index)
    }
}
 

Примечание: Я думаю, что у вас опечатка в первой строке( $array = @() )