2012-02-23 12 views
13

Questo è in risposta alla mia precedente domanda:PowerShell: Citando -replace & variabili

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

La mia domanda è: perché queste 2 righe di codice hanno output diverso:

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

E secondo i 2 articoli seguenti, perché la variabile '$ 1' nelle virgolette semplici non viene usata come stringa letterale? Tutto in virgolette singole dovrebbe essere trattato come una stringa di testo letterale, giusto?

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

risposta

18

Quando si utilizza virgolette singole dici PowerShell per utilizzare una stringa letterale tutto il che significa tra l'apertura e la chiusura citazione deve essere interpretato alla lettera.

Quando si usano virgolette, PowerShell interpreterà caratteri specifici all'interno delle virgolette.

Vedere get-help about_quoting_rules o fare clic su here.

Il simbolo del dollaro ha un significato speciale nelle espressioni regolari e in PowerShell. Si desidera utilizzare le virgolette singole se si intende utilizzare il simbolo del dollaro come espressione regolare.

Nel tuo esempio la regex a(\w) corrisponde alla lettera 'a' e quindi a un carattere di parola acquisito nel riferimento posteriore # 1. Quindi, quando si sostituisce con $1 si sostituisce il testo corrispondente ab con corrispondenza di riferimento posteriore b. Quindi ottieni bc.

Nel secondo esempio con le doppie virgolette, PowerShell interpreta "$1" come una stringa con la variabile $1 all'interno. Non hai una variabile denominata $1 quindi è nulla. Quindi la regex ha sostituito ab con null, motivo per cui si ottiene solo c.

+1

(la luce si spegne in testa) Ma grazie. Ben spiegato – Vippy

3

Il "$ 1" è un riferimento di regex. È creato dalla corrispondenza regex e esiste solo nel contesto di tale operazione di sostituzione. Non è una variabile di PowerShell.

"$ 1" verrà interpretato come una variabile di PowerShell. Se non esiste alcuna variabile denominata $ 1, il valore di sostituzione sarà nullo.

+0

Inoltre, grazie per la tua comprensione. Tutto aiuta. – Vippy

11

Nella seconda linea:

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

PowerShell sostituisce $ 1 prima che arrivi l'espressione regolare sostituzione operazione, come altri hanno affermato.È possibile evitare che la sostituzione utilizzando un backtick, come in:

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

Quindi, se si ha una stringa in il prefisso $ variabile che si voleva includere nella stringa di sostituzione, è possibile usarli anche nelle doppie virgolette in questo modo:

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