• This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn more.

Find/Replace

  • Thread starter eric.eickhoff@sbcglobal.net
  • Start date
E

eric.eickhoff@sbcglobal.net

#1
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
 
K

Keith Hill

#2
<eric.eickhoff@sbcglobal.net> wrote in message news:1174589436.498853.183440@n76g2000hsh.googlegroups.com...
> 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?


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
 
D

Duncan Smith

#3
>
> 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

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

#4
> 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" wrote:

> >
> > 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.
>
>
 
D

Duncan Smith

#5
On Mar 23, 11:57 am, /\/\o\/\/ [MVP] <o...@discussions.microsoft.com>
wrote:
> > 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" wrote:
>
> > > 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.


Thanks ;-)
 
A

aaronlerch@gmail.com

#6
On Mar 22, 11:52 pm, "Keith Hill" <r_keith_h...@mailhot.nospamIdotcom>
wrote:
> <eric.eickh...@sbcglobal.net> wrote in messagenews:1174589436.498853.183440@n76g2000hsh.googlegroups.com...
> > 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?

>
> 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


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