PowerShell: Quoting -replace & variables
Это ответ на мой предыдущий вопрос:
PowerShell: -replace, regex и ($) долларовые знаки
Мой вопрос: почему эти 2 строки кода имеют разный вывод:
'abc' -replace 'a(\w)', '$1'
'abc' -replace 'a(\w)', "$1"
И в соответствии с двумя статьями ниже, почему переменная '$ 1' в одинарных кавычках не используется как буквальная строка? Все в одинарных кавычках следует рассматривать как буквальную текстовую строку, правильно?
http://www.computerperformance.co.uk/powershell/powershell_quotes.htm
http://blogs.msdn.com/b/powershell/archive/2006/07/15/variable-expansion-in-strings-and-herestrings.aspx
Ответы
Ответ 1
Когда вы используете одинарные кавычки, вы указываете PowerShell использовать строковый литерал, означающий, что все, что находится между кадром открытия и закрытия, должно интерпретироваться буквально.
Когда вы используете двойные кавычки, PowerShell будет интерпретировать определенные символы внутри двойных кавычек.
См. get-help about_quoting_rules
или нажмите здесь.
Знак доллара имеет особое значение в регулярных выражениях и в PowerShell. Вы хотите использовать одинарные кавычки, если вы намерены использовать знак доллара в качестве регулярного выражения.
В вашем примере регулярное выражение a(\w)
соответствует букве "a", а затем символ слова, записанный в обратной ссылке # 1. Поэтому, когда вы заменяете $1
, вы заменяете согласованный текст ab
совпадением обратной ссылки b
. Итак, вы получаете bc
.
В вашем втором примере с использованием двойных кавычек PowerShell интерпретирует "$1"
как строку с переменной $1
внутри. У вас нет переменной с именем $1
, поэтому она равна нулю. Поэтому регулярное выражение заменило ab
на нуль, поэтому вы получаете только c
.
Ответ 2
Во второй строке:
'abc' -replace 'a (\ w)', "$ 1"
Powershell заменяет $1 до того, как получит операцию замены регулярных выражений, как утверждают другие. Вы можете избежать этой замены, используя обратную сторону, как в:
'abc' -replace 'a (\ w)', "` $1"
Таким образом, если у вас была строка в префиксе переменной $, которую вы хотели включить в заменяющую строку, вы можете использовать ее в двойных кавычках, например:
'abc' -replace 'a (\ w)', "$ prefix` $1"
Ответ 3
"$ 1" является регулярным выражением регулярного выражения. Он создается с помощью регулярного выражения, и он существует только в контексте этой операции замены. Это не переменная powershell.
"$ 1" будет интерпретироваться как переменная Powershell. Если переменная с именем $1 не существует, значение замены будет равно null.