2013-10-09 40 views
1

我有這個腳本,做一些正則表達式替換文件。我不明白爲什麼返回的字符串的所有換行符被刪除?爲什麼powershell Regex.Replace吞噬換行符?

樣品文件內容(UTF-8,與在每一行後CR-LF):

hello 
hello 
hello 

的腳本:

$content = Get-Content "c:\spikes\regexnewline\regexnewline.txt" 
Set-Content "c:\spikes\regexnewline\regexnewline-2.txt" $content # test 

$content = [regex]::Replace($content, "ll", "yy") #basic replace 

Set-Content "c:\spikes\regexnewline\regexnewline-3.txt" $content 

當然,文件regexnewline-2.txt是輸入的精確副本文件。但是regexnewline-3.txt怎麼只在一行上有內容,最後只有一個CR-LF?

heyyo heyyo heyyo\CR\LF 

顯然我在這裏錯過了一些東西。任何人都可以發現它?

順便說一句,我試圖玩正則表達式。更換和使用重載4個參數,指定RegexOptions,as documented on MSDN,但腳本失敗,說這個方法沒有4個參數的重載。 Powershell是否使用.Net框架的不同版本?

+0

@if您打印'$ content'到命令行,你本身是什麼e? –

回答

8

你看到這個的原因是因爲當你最初從文件中讀取時,$ content是一個字符串數組。可以看到任何變量的類型,如下所示:

$content.GetType().FullName 

獲取內容默認返回,其中每個元素表示一個行字符串的數組。當你將這個數組傳遞給.NET的regex replace方法時,PowerShell沒有看到一個方法重載,它接受一個字符串數組,但看到一個接受一個字符串的方法,所以它將你的字符串數組強制爲一個字符串。你可以看到同樣的效果,如果你在獲取內容的呼叫後,這樣做的權利:

"$content" 

你甚至可以修改PowerShell如何concats的各個元素,當它做到這一點:

$OFS = ", " 
"$content" 

而不是使用.NET正則表達式替換,請嘗試使用PowerShell的-replace運營商也處理regexs:只是把它的文件之前

$content = $content -replace 'll','yy' 
+0

Thx,你是我的英雄!另外,這是一個簡化的例子。我使用.Net的正則表達式,因爲真正的代碼使用了一個「MatchEvaluator」,它有點複雜,可以放入一行。 – Antoine

+0

沒問題。 MatchEvaluator非常方便。 –

+1

這個答案在我將頭撞到牆上一個小時後解除了我的困擾。我將補充說,Get-Content -Raw filename將返回一個單獨的字符串,而不是每行字符串的數組。 – NiloCK