PowerShell: citation de remplacer & variables
C'est en réponse à ma question précédente:
PowerShell: -remplacer, regex et ($) dollar signe malheurs
Ma question est: pourquoi ces 2 lignes de code de sortie différent:
'abc' -replace 'a(\w)', '$1'
'abc' -replace 'a(\w)', "$1"
ET selon les 2 articles ci-dessous, pourquoi ne pas la variable '$1' entre guillemets simples obtenir utilisé comme une chaîne littérale? Le tout dans des guillemets simples devrait être traitée comme une chaîne de texte littéral, non?
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
OriginalL'auteur Vippy | 2012-02-23
Vous devez vous connecter pour publier un commentaire.
Lorsque vous utilisez des guillemets simples vous dire PowerShell pour utiliser un littéral de chaîne de sens tout ce qui est entre l'ouverture et la fermeture de devis doit être interprété littéralement.
Lorsque vous utilisez des guillemets, PowerShell interpréter les caractères spécifiques à l'intérieur de guillemets doubles.
Voir
get-help about_quoting_rules
ou cliquez sur ici.Le signe dollar a une signification spéciale dans les expressions et dans PowerShell. Vous souhaitez utiliser les guillemets simples si vous avez l'intention du signe de dollar pour être utilisé comme l'expression régulière.
Dans votre exemple, l'expression régulière
a(\w)
est correspondant à la lettre " a " et puis un mot de caractères capturé dans le dos de référence #1. Ainsi, lorsque vous remplacez par$1
vous remplacez le texte correspondantab
avec en arrière match de référenceb
. Ainsi, vous obtenezbc
.Dans votre deuxième exemple avec l'aide de guillemets doubles PowerShell interprète
"$1"
comme une chaîne de caractères avec la variable$1
à l'intérieur. Vous n'avez pas une variable nommée$1
il est donc nulle. Donc la regex remplacéab
avec null, qui est pourquoi vous obtenez seulementc
.OriginalL'auteur Andy Arismendi
Dans votre deuxième ligne:
Powershell remplace le $1 avant qu'il arrive à la regex pour remplacer l'opération, comme d'autres l'ont dit. Vous pouvez éviter que le remplacement à l'aide d'un backtick, comme dans:
Ainsi, si vous aviez une chaîne dans une variable $prefix qui vous vouliez inclure dans la chaîne de remplacement, vous pouvez l'utiliser dans les guillemets comme ceci:
OriginalL'auteur David Rogers
Le "$1 " est une expression régulière de référence arrière. Il est créé par la regex match, et il n'existe que dans le cadre de cette opération de remplacement. Ce n'est pas une variable powershell.
"$1" sera interprété comme une variable Powershell. Si aucune variable appelée $1 existe, la valeur de remplacement sera nulle.
OriginalL'auteur mjolinor
Depuis je ne peux pas commenter ou upvote, David Rogers réponse a fonctionné pour moi. J'ai besoin d'utiliser la RegEx référence arrière ainsi que d'une variable Powershell dans un RexEx remplacer.
J'avais besoin de comprendre ce que le backtick fait avant, j'ai mis en place, voici l'explication: backtick est Powershell du caractère d'échappement.
Mon cas d'utilisation
Résultat
Alternatives
Chaîne de Format
Commentaires
comme par https://get-powershellblog.blogspot.com/2017/07/bye-bye-backtick-natural-line.html je vais probablement utiliser la chaîne de format méthode pour éviter l'utilisation de backticks.
OriginalL'auteur MickMorley