Заменить часть переменной в powershell без замены остальных?

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

пример:
переменная copyboard перед: https://thewikihow.com/video_FigUL6NWtqw
переменная copyboard тогда: id=FigUL6NWtqw

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

пауэршелл

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

1-й — НЕ используйте Out-String, так как он иногда добавляет в исходный код такие вещи, как новые строки. плюс, ваш ввод в буфер обмена, вероятно, уже является строкой. ///// 2-й — в вашем URL-адресе есть специальные символы регулярных выражений [например, точка], которые необходимо экранировать, прежде чем вы сможете использовать -replace на нем. этот оператор использует регулярное выражение. вы можете использовать [regex]::Escape() в URL-адресе ... или вместо этого вы можете использовать строковый метод .Replace() - он НЕ использует регулярное выражение. плюс есть и другие способы... например, разделение строки. [ухмылка]

Lee_Dailey 16.06.2019 13:56

Позвольте мне дать вам стандартный совет новичкам: если ответ решает вашу проблему, пожалуйста, примите его, нажав большую галочку (✓) рядом с ним, и, при желании, также проголосуйте за него (для этого требуется не менее 15 очков репутации). ). Если вы нашли другие ответы полезными, проголосуйте за них. Принятие (за что вы получите 2 очка репутации) и голосование помогут будущим читателям. См. эта статья для получения дополнительной информации. Если на ваш вопрос еще нет полного ответа, оставьте отзыв или самостоятельный ответ.

mklement0 18.06.2019 01:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 227
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Для достижения результатов можно использовать оператор 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 разбиваются на части, а результирующие части сохраняются как свойства объекта.

Использование оператора регулярного выражения -Replace с объектом uri:

([uri]$copyboard).Query -Replace "^[^=]+","id"

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

$a = 'https://thewikihow.com/video_FigUL6NWtqw'     
[regex]::escape('https://thewikihow.com/video_')                   

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

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

$a -replace [regex]::escape('https://thewikihow.com/video_'), 'id='

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

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

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

$a.replace('https://thewikihow.com/video_', 'id=')

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

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

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

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

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

Другие вопросы по теме