PowerShell: цитирование -замена и переменные - PullRequest
14 голосов
/ 24 февраля 2012

Это ответ на мой предыдущий вопрос:

PowerShell: - горе, регулярное выражение и ($) знак доллара

Мой вопрос: почему эти две строки кода имеют разный вывод:

'abc' -replace 'a(\w)', '$1'
'abc' -replace 'a(\w)', "$1"

И согласно 2 приведенным ниже статьям, почему переменная '$ 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

Ответы [ 4 ]

19 голосов
/ 24 февраля 2012

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

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

См. get-help about_quoting_rules или нажмите здесь .

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

В вашем примере регулярное выражение a(\w) соответствует букве 'a', а затем слово-символ, захваченное в обратной ссылке # 1. Поэтому, когда вы заменяете на $1, вы заменяете совпавший текст ab обратным ссылочным совпадением b. Итак, вы получите bc.

Во втором примере с использованием двойных кавычек PowerShell интерпретирует "$1" как строку с переменной $1 внутри. У вас нет переменной с именем $1, поэтому она равна нулю. Таким образом, регулярное выражение заменило ab на ноль, поэтому вы получаете только c.

14 голосов
/ 27 сентября 2013

Во второй строке:

'abc' -заменить '(\ w)', "$ 1"

Powershell заменяет 1 доллар, прежде чем он перейдет к операции замены регулярного выражения, как уже говорили другие. Вы можете избежать этой замены, используя обратную черту, как в:

'abc' -заменить 'a (\ w)', "` $ 1 "

Таким образом, если у вас есть строка в префиксе переменной $, которую вы хотите включить в строку замены, вы можете использовать ее в двойных кавычках, например:

'abc' -заменить 'a (\ w)', "$ prefix` $ 1"

4 голосов
/ 24 февраля 2012

$ 1 - обратная ссылка регулярного выражения.Он создается с помощью соответствия регулярному выражению и существует только в контексте этой операции замены.Это не переменная powershell.

«$ 1» будет интерпретироваться как переменная Powershell.Если переменная с именем $ 1 не существует, заменяющее значение будет нулевым.

1 голос
/ 08 октября 2018

Поскольку я не могу комментировать или поднять голос, ответ Дэвида Роджерса сработал для меня.Мне нужно было использовать как обратные ссылки RegEx, так и переменную Powershell в замене RexEx.

Мне нужно было понять, что сделал backtick, прежде чем я его реализовал, вот объяснение: backtick - это escape-символ Powershell.

Мой сценарий использования

$new = "AAA"
"REPORT.TEST998.TXT" -Replace '^([^.]+)\.([^.]+)([^.]{3})\.', "`$1.`$2$new."

Результат

REPORT.TESTAAA.TXT

Альтернативы

Формат строки

"REPORT.TEST998.TXT" -Replace '^([^.]+)\.([^.]+)([^.]{3})\.', ('$1.$2{0}.' -f )

Комментарии

согласно https://get -powershellblog.blogspot.com / 2017/07 / bye-bye-backtick-natural-line.html Вероятно, я буду использовать метод форматной строки, чтобы избежать использования обратных галочек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...