Заменить часть переменной в powershell, не заменяя остальные? - PullRequest
1 голос
/ 16 июня 2019

Итак, у меня есть сценарий PowerShell, который заменит URL-адрес Youtube, заменив "https://www.youtube.com/watch?v=" на "id=" без удаления идентификатора URL.

пример:
переменная copyboard перед: https://www.youtube.com/watch?v=FigUL6NWtqw
переменная в буфере: id=FigUL6NWtqw

Вот что я уже пробовал:

powershell

$Copyboard = Get-Clipboard | Out-String
$Copyboard = $Copyboard -replace "https://www.youtube.com/watch?v=", "id="

Ответы [ 3 ]

2 голосов
/ 16 июня 2019

Оператор Regex -Replace может использоваться для достижения результатов.Это заменяет все до первого = символа на id.

$Copyboard = $Copyboard -Replace "^[^=]+","id"

. Используя оператор -Split, вы можете добавить id= к значению запроса.Я разделяюсь с символом = в качестве разделителя и возвращаю все данные после = с индексом [1].Здесь я использовал оператор форматирования (-f), но вы можете использовать любой метод конкатенации, который вы выберете.

$Copyboard = "{0}{1}" -f 'id=',($Copyboard -Split "=")[1]

Альтернативный подход - сначала привести $Copyboard к [uri], что позже открывает другие опции для вашего кода, только если вы не переназначите $Copyboard с новым значением.Затем получите доступ к свойству (query в данном случае), которое вы хотите изменить, и выведите только измененное свойство.В объекте uri различные части скопированного uri разбиваются на части, а полученные части сохраняются как свойства объекта.

Использование оператора regex -Replace с объектом uri:

([uri]$copyboard).Query -Replace "^[^=]+","id"
1 голос
/ 16 июня 2019

В исходной строке есть несколько символов регулярного выражения '.'а также '?'.В основном вопросительный знак портит вас.(без "| out-string")

$a = 'https://www.youtube.com/watch?v=FigUL6NWtqw'     
[regex]::escape('https://www.youtube.com/watch?v=')                   

https://www\.youtube\.com/watch\?v=

Вы можете использовать экранированную версию:

$a -replace [regex]::escape('https://www.youtube.com/watch?v='), 'id='

Или использовать обратную косую черту?:

$a -replace 'https://www.youtube.com/watch\?v=', 'id='

Или.net .replace (), который не использует регулярное выражение:

$a.replace('https://www.youtube.com/watch?v=', 'id=')
0 голосов
/ 16 июня 2019

Похоже, вам просто нужно извлечь последний токен на основе = из входной строки, что проще всего (хотя и не так быстро) сделать с помощью оператора -split:

$Copyboard = 'id=' + ((Get-Clipboard -Format Text) -split '=')[-1]

Обратите внимание на использование -Format Text, чтобы гарантировать, что текст извлекается из буфера обмена.

Index [-1] извлекает элемент last из массива токенов, которыерезультат разделения строки на = с -split '=', что равно FigUL6NWtqw с вашим вводом сэмпла.

В качестве отступления: здесь нет никакой разницы, но обратите внимание, что PowerShell -split оператор , в отличие от метода .NET .Split() , разделяется на регулярных выражений и, как правило, более мощный, чем .Split() - см. этот ответ для больше.

...