如何在内容中使用$ _而不被powershell取代?

时间:2013-10-25 15:34:47

标签: regex powershell

我正在尝试将某个单词替换为某些PHP代码

$filecontent = [regex]::Replace($filecontent, $myword, $phpcode)

但$ phpcode有一些PHP代码也使用特殊变量$ _

<?php $cur_author = (isset($_GET['author_name'])) ? get_user_by('slug', $author_name) : get_userdata(intval($author)); ?>

问题是当代码在$ filecontent中被替换时,它会替换PHP代码中的$ _变量($ _GET),它已经在管道上。

其他变量如$ author_name。

不会发生这种情况

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

您有两种选择。首先使用单引号字符串,PowerShell会将其视为逐字字符串(C#term),即它不会尝试字符串插值:

'$_ is passed through without interpretation'

另一个选项是转义双引号字符串中的$字符:

"`$_ is passed through without interpretation"

当我搞乱正则表达式时,我将默认使用单引号字符串,除非我有一个需要在字符串内插入的变量。

另一种可能性是$_被正则表达式解释为替换组,在这种情况下,您需要在$上使用替换转义符,例如$$

答案 1 :(得分:3)

这对你有用吗?

$filecontent = [regex]::Replace($filecontent, $myword, {$phpcode})

在正则表达式替换操作中,$ _是一个代表整个字符串的保留替换模式

http://msdn.microsoft.com/en-us/library/az24scfc.aspx

将它包装在大括号中使其成为一个scriptblock委托,绕过正常的正则表达式模式匹配算法进行替换。

答案 2 :(得分:1)

我不确定我是否正确地关注了你,但这有帮助吗?

$file = path to your file
$oldword = the word you want to replace
$newword = the word you want to replace it with

如果您要替换的Oldword具有特殊字符(即。\或$),则必须先将它们转义。你可以通过在特殊字符前加一个反斜杠来逃避它们。 Newword,不需要转义。 A $将成为“\ $”。

(get-content $file) | foreach-object {$_ -replace $oldword,$NewWord} | Set-Content $file