Windows Vista Forums

Find/Replace

  1. #1


    eric.eickhoff@sbcglobal.net Guest

    Find/Replace

    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


      My System SpecsSystem Spec

  2.   


  3. #2


    Keith Hill Guest

    Re: Find/Replace

    <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

      My System SpecsSystem Spec

  4. #3


    Duncan Smith Guest

    Re: Find/Replace

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


      My System SpecsSystem Spec

  5. #4


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

    Re: Find/Replace

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


      My System SpecsSystem Spec

  6. #5


    Duncan Smith Guest

    Re: Find/Replace

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


      My System SpecsSystem Spec

  7. #6


    aaronlerch@gmail.com Guest

    Re: Find/Replace

    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/...-function.html


      My System SpecsSystem Spec


Find/Replace
Similar Threads
Thread Forum
find in files and replace PowerShell
Reverse Find and Replace ? PowerShell
find/replace on file VB Script
Advanced find and replace using VBScript VB Script
Find and Replace Utility ? Vista General