2012-02-23 17 views
13

Esto es en respuesta a mi anterior pregunta:PowerShell: Citando -replace y las variables

PowerShell: -replace, regex and ($) dollar sign woes

Mi pregunta es: ¿por qué estas 2 líneas de código tienen salida diferente:

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

Y de acuerdo con los 2 artículos siguientes, ¿por qué la variable '$ 1' en comillas simples no se usa como una cadena literal? Todo en comillas simples debe tratarse como una cadena de texto literal, ¿verdad?

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

Respuesta

18

Al utilizar comillas simples le dice PowerShell para utilizar una cadena literal que significa todo lo que entre la apertura y el cierre de cotización debe ser interpretado literalmente.

Al utilizar comillas dobles, PowerShell interpretará caracteres específicos dentro de las comillas dobles.

Ver get-help about_quoting_rules o haga clic en here.

El signo del dólar tiene un significado especial en las expresiones regulares y en PowerShell. Desea utilizar las comillas simples si desea que el signo de dólar se use como expresión regular.

En su ejemplo la expresión regular a(\w) está haciendo juego la letra 'a' y luego un carácter de palabra capturado en referencia de nuevo # 1. Por lo tanto, cuando reemplaza con $1, está reemplazando el texto coincidente ab con la referencia de referencia coincidente b. Entonces obtienes bc.

En su segundo ejemplo con el uso de comillas dobles, PowerShell interpreta "$1" como una cadena con la variable $1 dentro. No tiene una variable llamada $1, por lo que es nula. Entonces, la expresión regular reemplazó a ab con nulo, por lo que solo obtiene c.

+1

(la luz se apaga en la cabeza) Ma gracias ny. Bien explicado. – Vippy

3

El '$ 1' no es una referencia inversa de expresiones regulares. Se crea mediante la coincidencia de expresiones regulares, y solo existe dentro del contexto de esa operación de reemplazo. No es una variable Powershell.

"$ 1" se interpreta como una variable PowerShell. Si no existe una variable llamada $ 1, el valor de reemplazo será nulo.

+0

Además, gracias por su visión. Cualquier cosa ayuda. – Vippy

11

En su segunda línea:

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

Powershell reemplaza el $ 1 antes de que llegue a la expresión regular la operación de sustitución, como otros han declarado.Puede evitar que el reemplazo mediante el uso de un acento grave, como en:

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

Por lo tanto, si usted tenía una cadena en un prefijo $ variable que usted quiere incluir en la cadena de reemplazo, usted podría utilizarlo en las comillas dobles como esto:

'abc' -replace 'un (\ w)', "$ prefix` $ 1"

Cuestiones relacionadas