Поиск по сайту:

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


Вам нужно заменить строку или символ в PowerShell? Или вы хотите вставить целые текстовые блоки в файл? Тогда функция замены в PowerShell - это то, что вам нужно.

С помощью метода Replace или оператора -replace в PowerShell мы можем найти и заменить любой символ или (часть) строки на другие данные.

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

Powershell Замена символа в строке

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

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

Давайте возьмём следующую строку:

$str = "Welcome to LazyAdmin"

Чтобы заменить слово to на at, мы можем использовать следующий метод:

$str = $str.Replace('to','at')

Я сохранил результат метода replace в ту же переменную. Вам не нужно использовать переменные для использования метода replace в PowerShell, вы также можете напрямую заменить строку, если хотите.

"Welcome to LazyAdmin".Replace('to','at')

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

$Paths = "folder\subfolder"
$Paths.replace('\','\\')

Result
folder\\subfolder

Удаление символов или слов из строки

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

Replace the word 'to' with nothing
$str.Replace("to","")

Давайте возьмем список адресов электронной почты и удалим из него доменное имя и символ @, так что у нас останутся только имена пользователей. Мы будем проходить по массиву с адресами электронной почты и сохранять результат в $usernames:

$mailAddresses = @("AdeleV@lazydev.com","GradyA@lazydev.com","JoniS@lazydev.com")
$usernames = @()

$mailAddresses | ForEach{
    $usernames += $_.Replace("@lazydev.com","")
}

Result
AdeleV
GradyA
JoniS

Вставьте текст в шаблоны с помощью замены

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

Для этих электронных писем я создал HTML-шаблон письма, и внутри этого шаблона я разместил заполнители для имени пользователя и пароля.

<p>Hi {{manager.firstname}},</p>
<p>The account for {{user.fullname}} is ready. Below you will find the login credentials for {{user.firstname}}. The password is temporary and needs to be changed after the first login.</p>
  <p>
	  <table class="details">
		  <tr>
			  <td style="font-family:sans-serif;font-size:14px;">Username: </td>
			  <td style="color:#000000;"><strong>{{user.UserPrincipalName}}</strong></td>
		  </tr>
		  <tr>
			  <td style="font-family:sans-serif;font-size:14px;">Password: </td>
			  <td><strong>{{user.Password}}</strong></td>
		  </tr>
	  </table>
  </p>
<p>If you have any questions, please let us know</p>
<p>IT</p>

Как вы можете видеть в HTML-шаблоне, я создал заполнители с фигурными скобками {{ }}. С помощью PowerShell мы можем загрузить содержимое HTML-файла и использовать замену, чтобы заменить все заполнители на правильные значения:

#Get the mailtemplate
$mailTemplate = (Get-Content ($rootPath + '\' + $config.Settings.mailTemplateManager)) | ForEach-Object {
	$_ 	-replace '{{manager.firstname}}', $manager.GivenName `
	-replace '{{user.UserPrincipalName}}', $user.UserPrincipalname `
	-replace '{{user.Password}}', $config.Settings.password `
	-replace '{{user.fullname}}', $user.fullName `
	-replace '{{user.firstname}}', $user.givenName
} | Out-String	
		
return $mailTemplate

В этом случае я использовал оператор –replace, но вы также можете использовать метод replace(), чтобы заменить несколько экземпляров:

$str = "Welcome to LazyAdmin"
$str.Replace('Welcome','Hello').Replace('to ','')

Result
Hello LazyAdmin

Замена регулярных выражений в PowerShell

Помимо метода Replace(), у нас также есть оператор -replace. В основном, они могут делать одно и то же: заменять любой символ или слово в строке на что-то другое. Но между ними есть большое различие: оператор -replace использует регулярные выражения для совпадения с частью, которую нужно найти.

Заметка

Оператор -replace использует регулярные выражения только для поиска ключевого слова. Он не использует регулярные выражения в части замены оператора.

Давайте возьмем следующий пример: у меня есть список лог-файлов, которые я хочу переименовать с .log на .txt, например.

Для этого мы можем использовать оператор -replace в PowerShell, чтобы выбрать .log в конце строки и заменить его на .txt.

Get-ChildItem c:\temp\files | Rename-Item -NewName { $_.name -replace '\.log$','.txt' }

Теперь в этом случае мы также можем использовать метод replace(), потому что .log достаточно уникален для выбора и замены. Но если мы хотим удалить год из имени файла, то нам придется использовать регулярные выражения для этого:

Find 4 digits with \d{4}
Get-ChildItem c:\temp\files | Rename-Item -NewName { $_.name -replace '\d{4}','' }

Создание регулярного выражения всегда немного сложно, если вы не делаете этого каждый день. Хороший сайт для тестирования ваших выражений - regex101.com.

Замена с учетом регистра и без учета регистра

Оператор -Replace по умолчанию не различает регистр. Вы можете сделать его чувствительным к регистру, используя оператор -creplace вместо -replace. Например:

$str = "Hello LazyAdmin"

Case insensitive
$str -replace 'hello', 'Goodbye';
Result : Goodbye LazyAdmin

Case sensitive
$str -creplace 'hello', 'Goodbye;
Result : Hello LazyAdmin

Замена специальных символов в PowerShell

С помощью оператора замены в PowerShell мы можем легко заменить все специальные символы в строке. Регулярные выражения позволяют нам выбрать все несловесные символы, то есть все, кроме a-z, A-Z и 0-9, на что-то другое.

Например:

$str = "Long [String] with _special@character#123$% and (spaces)'"
$str -replace ('\W', '')

Result
LongStringwith_specialcharacter123andspaces

Если вы хотите удалить все специальные символы, кроме пробелов, то нам нужно использовать немного другое регулярное выражение:

$str = "Long [String] with _special@character#123$% and (spaces)'"
$str -replace ('[^a-zA-Z\d\s:]', '')

Result
Long String with specialcharacter123 and spaces

Завершение

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

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

Если у вас есть вопросы, просто оставьте комментарий ниже.