10

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

Fadrian Sudaman
  • 6,405
  • 21
  • 29

1 Answers1

21

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.

Joey
  • 344,408
  • 85
  • 689
  • 683
James Kolpack
  • 9,331
  • 2
  • 44
  • 59