Оператор -replace в PowerShell — является упрощенной реализацией метода Replace класса System.Text.RegularExpressions.Regex –> альяс в [regex]::Replace.
Реализация оператора –replace в PowerShell Core методом internal static object ReplaceOperator.
Синтаксис:
PowerShell Desktop
input –[ci]replace pattern, [replacement]
PowerShell Core
input –[ci]replace pattern, [replacement]
input –replace pattern, [evaluator]
[] – необязательные аргументы
input – входная строка или массив строк
pattern – шаблон регулярного выражения
replacement – строка замены
evaluator — пользовательский метод, анализирующий каждое совпадение и возвращающий либо исходную строку с совпадениями, либо строку замены.
Большинство –op операторов, представлены в двух версиях:
-creplace : с учетом регистра (case sensitive (-cop)) , указывается опция RegexOptions.None
-ireplace = replace : без учета регистра (case-insensitive (-iop)) , указывается опция RegexOptions.IgnoreCase
Пару условных правил:
- -replace не изменяет первоначальную строку, а возвращает новый объект строки в измененном варианте
- при несовпадении шаблона, строка возвращается как есть
- при отсутствии шаблона используется ""
Примеры:
# input -[ci]replace pattern PS > "Hello" -replace "ll" Heo PS > "Hello" -ireplace "h" ello PS > "Hello" -creplace "h" Hello # input –[ci]replace pattern, [replacement] PS > "aabc" -replace "a","b" bbbc PS > "Abcd" -ireplace "a","B" Bbcd PS > "Abcd" -creplace "[a-z]","B" ABBB
В PowerShell Core добавили параметр evaluator, который может принимать следующие значения:
- ScriptBlock
- Объект класса [System.Text.RegularExpressions.MatchEvaluator]
- Пользовательский класс с статическим методом
ScriptBlock, каждое совпадение по шаблону сохраняется в переменной $_ или $psitem.
$_.GetType().FullName — System.Text.RegularExpressions.Match
PS > "A1B2C3" -replace "\d", {[int]$_[0].Value*2} A2B4C6 PS > "A1B2C3" -replace "\d", {$psitem[0].Value*3} A111B222C333 PS > $_[0] Groups : {0} Success : True Name : 0 Captures : {0} Index : 5 Length : 1 Value : 3 PS > $_[0].Value 3
MatchEvaluator, каждое совпадение по шаблону сохраняется в переменной $args или param($var).
PS > $matchEvaluator = {[int]$args[0].Value*2} -as [System.Text.RegularExpressions.MatchEvaluator] PS > "A1B2C3" -replace "\d", $matchEvaluator A2B4C6 PS > $matchEvaluator = [System.Text.RegularExpressions.MatchEvaluator]{param($m) [int]$m[0].Value*3} PS > "A1B2C3" -replace "\d", $matchEvaluator A3B6C9
Пользовательский класс с статическим методом, каждое совпадение по шаблону сохраняется в переменной MethodName([ObjectClass]$var).
PS > class matchEvaluator { static [string] Replace([System.Text.RegularExpressions.Match]$m) { return [int]$m[0].Value*3 } } "A1B2C3" -replace "\d", [matchEvaluator]::Replace A3B6C9
В PowerShell Desktop evaluator можно использовать через [regex]::Replace.
PS > [regex]::Replace("A1B2C3","\d",{[int]$args[0].Value*2}) A2B4C6 PS > [regex]::Replace("A1B2C3","\d",{param($m) [int]$m[0].Value*3}) A3B6C9
Для массива строк мы можем использовать аналогичные действия:
PS > "1abc","2qwe","3rty" -replace "\d" abc qwe rty
PS > "1abc","2qwe","3rty" -replace "\d","X"
Xabc
Xqwe
Xrty
PS > "1abc","2qwe","3rty" -replace "\d",{[int]$_[0].Value*2} 2abc 4qwe 6rty
Подстановки в регулярных выражениях подробно описано на docs.microsoft.com,я лишь приведу примеры использования.
* Для экранирования символа подстановки $ используйте ` (backtick) – "`$" если используются двойные кавычки
‘$’ – не требуется экранирования
"`$" – экранирование
("Abc`$1" + ‘$1’ + "Xyz") – комбинирование
# $number The text matched by group number number. # $0 - весь шаблон # $1 - первая группа # $2 - вторая группа PS > "111-2222" -replace "(\d{3})-(\d{4})",'($1) : $2' (111) : 2222 PS > "111-2222" -replace "(\d{3})-(\d{4})","(`$1) : `$2" (111) : 2222 PS > "111-2222" -replace "(\d{3})-(\d{4})","'`$`$1 - `$1' : `$`$2 - '`$2'" '$1 - 111' : $2 – '2222' PS > "String" -replace "(.+)ing",("Abc" + '$1' + "Xyz") AbcStrXyz # ${name} The text matched by group named name. PS > "Dog name" -replace "^(?<dog>.{3}).+",'${dog} pop' Dog pop # $$ A literal $.
PS > "1234" -replace "\d",'$$' $$$$ #$& A copy of the entire match.
PS > "Moscow" -replace "^.*$",'Capital: $&' Capital: Moscow #$` The text of the input string that precedes the match.
PS > "PreText" -replace "Text$",'$`' PrePre #$' The text of the input string that follows the match.
PS > "PreText" -replace "Pre",'$''' TextText #$+ The last group captured.
PS > "PreText" -replace "(.+)Text",'$+Now' PreNow #$_ The entire input string.
PS > "String" -replace "(.*)ing",'Entire String: $_' Entire String: String