我正在尝试将某个单词替换为某些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。
不会发生这种情况我该如何解决这个问题?
答案 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