2010-04-28 69 views
8

我是powershell中的新手。我有一个简单的powershell脚本,只是替换文本,但我发现,正则表达式替换将我的多行数据源转换为单行文本,当输出产生时。我想要保留线条。这是脚本的哑巴版本。Powershell替换丢失换行符

$source=(Get-Content textfile.txt) 

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

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

您可以创建简单的线条像这样的测试文件调用TextFile.txt的测试它

line 
line 
Some line 
More line here 

我错过了一些东西明显?

感谢, Fadrian

回答

17

你的问题就在这里是Get-Content返回string[](与源文件中的每一行一项),而[regex]::Replace需要一个字符串。这就是为什么数组将首先转换为一个字符串,这意味着将所有项目集中在一起。

PowerShell中提供了一个操作者-replace将更多地处理这种情况下:

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

-replace操作者在阵列的每个项目进行操作单独我它应用于阵列。

是的,它会进行正则表达式匹配并替换。例如:

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

更多herehere一点。

+0

此作品谢谢。仍然想知道为什么正则表达式的行为方式与.NET环境中实际运行正则表达式不同。 – 2010-04-28 04:25:14

+2

@Fadrian:我在答案的开头添加了一段话来解释你的原始问题。希望能帮助到你。 – Joey 2010-04-28 07:42:14

+0

感谢Johannes +1的回复和+1的帖子 – 2010-04-28 09:34:35