Pedro Monte
Pedro Monte

Reputation: 235

How to use $_ in content without been replaced by powershell?

I'm trying to replace a word to some php code

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

But the $phpcode have some php code using also a Special variable $_

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

The problem is when the code is replace in $filecontent it replaces the $_ variable from the php code ( $_GET ) with it have on the pipeline.

This not happen with the other variables like $author_name .

How can I resolve this?

Upvotes: 0

Views: 214

Answers (3)

mjolinor
mjolinor

Reputation: 68311

Does this work for you?

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

In a regex replace operation the $_ is a reserved substituion pattern that represents the entire string

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

Wrapping it in braces makes it a scriptblock delegate, bypassing the normal regex pattern matching algorithms for doing the replacement.

Upvotes: 3

Keith Hill
Keith Hill

Reputation: 201832

You have two options. First use a single quoted string and PowerShell will treat that as a verbatim string (C# term) i.e. it won't try to string interpolate:

'$_ is passed through without interpretation'

The other option is to escape the $ character in a double quoted string:

"`$_ is passed through without interpretation"

When I'm messing with a regex I will default to using single quoted strings unless I have a variable that needs to be interpolated inside the string.

Another possibility is that $_ is being interpreted by regex as a substitution group in which case you need to use the substitution escape on the $ e.g. $$.

Upvotes: 3

Bill
Bill

Reputation: 554

Im not sure I am following you correctly, but does this help?

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

If the Oldword you are replacing has special charactes ( ie. \ or $ ) then you must escape them first. You can escape them by putting a backslash in front of the special character. The Newword, does not need to be escaped. A $ would become "\$".

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

Upvotes: 1

Related Questions