Как использовать PowerShell Replace для замены текста [Примеры]

Как и многие другие языки, PowerShell может работать со строками и текстом. Одной из полезных функций является возможность использования PowerShell для замены символов, строк или даже текста в файлах.

В этом руководстве вы узнаете, как использовать метод replace() и оператор replace в PowerShell. Руководство охватит основы и даже погрузится в некоторые “интересные” регулярные выражения!

Прежде чем начать

Вам не потребуется много, чтобы следовать всем примерам в этом руководстве; вам просто понадобится PowerShell. В этом руководстве примеры будут использовать PowerShell v7.0.2, но все примеры должны работать в Windows PowerShell.

Использование PowerShell для замены строк: Основы

Одним из самых простых случаев использования PowerShell для замены является замена символов в строках. Давайте начнем с примеров.

Предположим, у вас есть строка в PowerShell со значением hello, world.

$string = 'hello, world'

Вы хотели бы заменить строку hello внутри этой строки на строку hi, чтобы переменная $string имела значение hi, world. Для этого PowerShell сначала должен определить, где находится текст “поиска”. После того как он найден, заменяется этот текст заданным пользователем значением.

Использование метода Replace()

Один из самых простых способов замены строк в PowerShell – использовать команду replace, как показано ниже. Метод replace() имеет два аргумента: строку для поиска и строку для замены найденного текста.

Как видно ниже, PowerShell находит строку hello и заменяет эту строку на строку hi. Затем метод возвращает конечный результат, который представляет собой hi, world.

PS> $string.replace('hello','hi')
hi, world

Вы можете вызывать метод замены PowerShell для любой строки, чтобы заменить любую буквальную строку другой строкой. Если строка для замены не найдена, метод replace() ничего не возвращает.

Вам не нужно присваивать строку переменной, чтобы заменить текст в строке. Вместо этого вы можете вызвать метод replace() напрямую для строки, например: 'hello world'.replace('hello','hi'). В учебнике используется переменная для удобства.

Удаление символов

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

PS> $string.replace('hello','')
, world

Замена нескольких экземпляров

Теперь у вас есть код для замены строки внутри другой строки. Что насчет замены нескольких строк? Нет проблем.

Поскольку метод замены PowerShell возвращает строку, чтобы заменить еще один экземпляр, вы можете добавить еще один вызов метода replace() в конец. Затем PowerShell вызывает метод replace() для вывода оригинала.

PS> $string.replace('hello','').replace('world','earth')
, earth

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

Использование оператора замены в PowerShell

Хотя использование метода замены строки в PowerShell является самым простым способом замены текста, вы также можете использовать оператор замены PowerShell replace. Оператор replace похож на метод тем, что вы предоставляете строку для поиска и замены. Но у него есть одно большое преимущество: возможность использования регулярных выражений (regex) для поиска соответствующих строк (подробнее позже).

Используя вышеприведенный пример, вы можете использовать оператор replace для замены hello на hi таким же образом, как показано ниже. PowerShell выполняет те же шаги.

PS> $string -replace 'hello','hi'
hi, world

Удаление символов

Как и при использовании метода замены PowerShell, вы также можете удалять символы из строки с использованием оператора replace. Но, в отличие от метода replace(), вы также можете полностью исключить строку в качестве аргумента для замены, и вы обнаружите тот же эффект.

PS> $string -replace 'hello',''
, world
PS> $string -replace 'hello'
, world

Замена нескольких вхождений

Как и метод replace(), вы также можете объединять вместе использование оператора replace. Поскольку оператор replace возвращает строку, как показано ниже. Вы увидите в следующем разделе, что ваш код будет более чистым при использовании regex.

PS> $string -replace 'hello','hi' -replace 'world','earth'
hi, earth

Использование замены PowerShell Regex

Как упоминалось ранее, замена строк в методе замены PowerShell работает, но она ограничена. Вам разрешено использовать только буквальные строки. Нельзя использовать подстановочные знаки или регулярные выражения. Если вы выполняете какие-либо промежуточные или продвинутые замены, вы должны использовать оператор replace.

Допустим, у вас есть скрипт, который содержит строку, созданную с использованием переменной. Эта строка должна быть либо hello, world, либо hi, world. Возможно, у вас был плохой день в качестве системного администратора, и вы хотите изменить строку, независимо от значения, на goodbye, world.

Вам нужно, чтобы hello, world и hi, world преобразовывались в goodbye, world. Для этого вам нужно использовать регулярное выражение. Вы можете сопоставить практически любой конкретный шаблон в тексте с использованием регулярных выражений.

В этом примере вы можете использовать выражение hello|hi, чтобы сопоставить обе необходимые строки с использованием регулярного выражения символ “или” (|), как показано ниже.

PS> 'hello, world' -replace 'hello|hi','goodbye'
goodbye, world
PS> 'hi, world' -replace 'hello|hi','goodbye'   
goodbye, world

Как только вы научитесь использовать регулярные выражения для поиска строк, вы можете использовать PowerShell для замены подстановочных строк, которые соответствуют любому шаблону.

Экранирование символов регулярных выражений

В приведенном выше примере регулярное выражение не содержало никаких специальных символов регулярных выражений в строке поиска. Язык регулярных выражений использует определенные символы, которые не интерпретируются буквально, как большинство букв и цифр.

Например, возможно, вам нужно заменить текст в строке. Эта строка содержит несколько специальных символов регулярных выражений, таких как скобка и вопросительный знак. Затем вы пытаетесь заменить строку [hello] на goodbye, как показано ниже.

PS> '[hello], world' -replace '[hello]','goodbye'
[goodbyegoodbyegoodbyegoodbyegoodbye], wgoodbyergoodbyed

Видно, что это совсем не то, что вы имели в виду. Эта ситуация возникает, когда вы используете специальные символы регулярных выражений внутри строки для поиска ([hello]).

Чтобы избежать этой проблемы, у вас есть два варианта. Вы можете экранировать эти специальные символы, добавив обратный слеш перед каждым символом, или использовать метод Escape().

Ниже вы можете увидеть эффект экранирования каждого специального символа обратным слешем.

PS> '[hello], world' -replace '\[hello\]','goodbye'
goodbye, world

Кроме того, рекомендуется использовать метод Escape() типа regex, который автоматически удаляет все специальные символы.

PS> '[hello], world' -replace ([regex]::Escape('[hello]')),'goodbye'
goodbye, world

Вы должны использовать метод Escape() везде, где это возможно, потому что он экранирует все специальные символы, и вам не нужно их запоминать.

Использование групп совпадений/захвата

Во всех предыдущих примерах в этом руководстве использовалась буквальная строка для замены другой строки. Вы использовали hi или goodbye. Но что если вы хотите использовать один или несколько символов, которые PowerShell нашел в строке для замены? Вам нужно будет соответствовать или захватывать группы.

Регулярные выражения имеют концепцию, называемую группами захвата и обратными ссылками. Группы захвата позволяют вам захватывать строки, чтобы затем ссылаться на них в другом месте. PowerShell использует эту функцию, используя группы совпадений с оператором replace.

Например, предположим, у вас есть строка, которая может содержать несколько разных значений.

'hello world, you sexy beast'
'hi world, now go away'
'hello earth, you are lovely today'

Вы хотели бы поменять местами первую часть строки со второй, чтобы они выглядели так:

'you sexy beast,hello world'
'now go away,hi world'
'you are lovely today,hello earth'

Для выполнения этого действия PowerShell должен найти всю текст справа и слева от запятой. Как только он узнает, что это за текст, он должен заменить один на другой. Для этого вам нужны обратные ссылки.

A backreference is a regex variable (not a PowerShell variable) that represents the text that regex matched. Backreferences in PowerShell are represented with a dollar sign followed by a number indicating the order in which they were matched.

Вы можете увидеть пример ниже.

## Эта строка также может быть:
## 'hi, world, now go away'
## 'hello, earth, you are lovely today'
PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(.*), (.*)','$2,$1'
you sexy beast,hello world

В приведенном примере вы можете видеть захватывающие группы regex, заключающие каждое совпадение (hello world) и (you sexy beast) в скобки. Затем для замены сначала было найдено совпадение hello world слева направо, поэтому оно получает метку обратной ссылки $1, а you sexy beast – метку обратной ссылки $2.

Как только PowerShell узнает значение для каждого совпадения, вы можете использовать эти ссылки в заменяемом тексте так, как вам угодно. В этом примере $2,$1 меняют их позиции.

Использование именованных групп совпадений

Если вы предпочитаете не использовать числовые заполнители типа $1, $2, чтобы обращаться к значениям совпадений, вы также можете использовать метки или имена. Вместо того чтобы считать слева направо, что означают эти ссылки, вы можете просто использовать имена.

Для использования имен в качестве ссылок вам нужно сначала определить метки для каждого совпадения в строке совпадения. Для этого вы должны определить группу захвата, например, как (?<label><regex>), где label – это имя, а <regex> – это используемое регулярное выражение.

После того как вы определили имена, вы можете ссылаться на них в строке замены, используя знак доллара и заключив имя в фигурные скобки, например, ${label}.

Вы можете увидеть демонстрацию этой техники ниже.

PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(?<First_Part>.*), (?<Second_Part>.*)','${Second_Part},${First_Part}'
you sexy beast,hello, world

Заключение

Как вы узнали, оператор замены PowerShell позволяет заменять символы, текст и строки различными способами. Для выполнения простых замен вы можете использовать метод replace(), но если вам нужно выполнить более сложные замены, всегда используйте оператор replace.

Source:
https://adamtheautomator.com/powershell-replace/