Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Find/Replace

106 views
Skip to first unread message

eric.e...@sbcglobal.net

unread,
Mar 22, 2007, 2:50:36 PM3/22/07
to
Hello,

I am just learning PowerShell and need a little guidance.

What I am trying to do is to search a directory recursively for files
that contain a text string and modify the file(s) by replacing that
string with other text.

To do the search, I can use:

dir -r c:\temp\* | Select-string "xyz"

but from there, I am not sure how to go about doing the replace in
each file found.

Can anyone point me in the right direction to accomplish this?

Thanks,

-e

Keith Hill

unread,
Mar 22, 2007, 11:52:46 PM3/22/07
to
There isn't a native PowerShell cmdlet that replaces strings in files in place.  However there is a -replace operator that provides the basic replace functionality.  You will need to do this in several steps:
 
$pattern = 'some search pattern - could be regex'
$replacement = 'some replacement potentially using capture groups like so $1 $2 or ${namedGroup}'
foreach ($file in (gci c:\temp\* -rec)) {
    $text = get-content $file
    if ($text -match $pattern) {
       $text -replace $pattern, $replacement > $file
    }
}
 
--
Keith

Duncan Smith

unread,
Mar 23, 2007, 3:05:00 AM3/23/07
to
>
> There isn't a native PowerShell cmdlet that replaces strings in files in place. However there is a -replace operator that provides the basic replace functionality. You will need to do this in several steps:
>
> $pattern = 'some search pattern - could be regex'
> $replacement = 'some replacement potentially using capture groups like so $1 $2 or ${namedGroup}'
> foreach ($file in (gci c:\temp\* -rec)) {
> $text = get-content $file
> if ($text -match $pattern) {
> $text -replace $pattern, $replacement > $file
> }
>
> }
>

That looks interesting, I was still thinking of a solution using the
Win32 Unix tools find, egrep and sed, bur their sed implementation
didn't update files in place so it all fell a bit flat..

I'm a little puzzled by where -match and -replace come from, as they
are not native to powershell and do not appear to be members of the
string class either. Do they belong to an object - I can't find the
documentation in MSDN 2005?

Thanks,

Duncan.

/\/\o\/\/ [MVP]

unread,
Mar 23, 2007, 7:57:02 AM3/23/07
to
> I'm a little puzzled by where -match and -replace come from, as they
> are not native to powershell and do not appear to be members of the
> string class either. Do they belong to an object - I can't find the
> documentation in MSDN 2005?

they asre native powershell operators, for more information see :

Get-Help about_operator

Greetings /\/\o\/\/

Duncan Smith

unread,
Mar 23, 2007, 10:24:03 AM3/23/07
to
On Mar 23, 11:57 am, /\/\o\/\/ [MVP] <o...@discussions.microsoft.com>
wrote:

Thanks ;-)

eric.e...@sbcglobal.net

unread,
Mar 26, 2007, 8:05:20 AM3/26/07
to
On Mar 22, 11:52 pm, "Keith Hill" <r_keith_h...@mailhot.nospamIdotcom>
wrote:
> <eric.eickh...@sbcglobal.net> wrote in messagenews:1174589436.4...@n76g2000hsh.googlegroups.com...

Thanks Keith -- I will give this a shot!

-e

aaron...@gmail.com

unread,
Mar 28, 2007, 7:52:25 AM3/28/07
to
On Mar 22, 11:52 pm, "Keith Hill" <r_keith_h...@mailhot.nospamIdotcom>
wrote:
> <eric.eickh...@sbcglobal.net> wrote in messagenews:1174589436.4...@n76g2000hsh.googlegroups.com...

Thanks Keith!

I think this function takes what you wrote and expresses it in an easy
to reuse way (if not a little harder to read):

function Replace-String($find, $replace, $includes)
{
get-childitem $includes | select-string $find -list |% { (get-
content $_.Path) |% { $_ -replace $find, $replace } | set-content
$_.Path }
}

http://www.aaronlerch.com/blog/2007/03/powershell-replace-string-function.html

0 new messages