views:

267

answers:

1

Hi, I am a newbie in powershell. I have a simple powershell script that just replace text but I found that the regex replace turn my multiline data source into a single line text when the output is produced. I want the line breaks to be preserved. Here is the dumb down version of the script.

$source=(Get-Content textfile.txt)

$process1 = [regex]::Replace($source, "line", "line2")

$process1 | out-file -encoding ascii textfile2.txt

You can create a test file call textfile.txt with simple lines like this to test it

line 
line
Some line
More line here

Have I missed something obvious?

Thanks, Fadrian

+3  A: 

Your problem here is that Get-Content returns a string[] (with one item for each line in the source file) while [regex]::Replace expects a string. That's why the array will first be converted to a string which simply means lumping together all items.

PowerShell provides a -replace operator which will handle this case more gracefully:

(Get-Content .\textfile.txt) -replace 'line', 'line2' | 
   out-file -encoding ascii textfile2.txt

The -replace operator operates on each item of an array individually i it's applied to an array.

And yes, it does regular expression matches and replaces. For example:

> (Get-Content .\textfile.txt) -replace '(i|o|u)', '$1$1'
liinee
liinee
Soomee liinee
Mooree liinee heeree

Read a bit more here and here.

James Kolpack
This works thanks. Still wonder why the regex behaves the way it is, different from actually running the regex in .NET environment.
Fadrian Sudaman
@Fadrian: I added a paragraph at the start of the answer explaining your original problem. Hope it helps.
Joey
Thanks Johannes +1 for reply and +1 for the post
Fadrian Sudaman