1

ファイルで正規表現の置換を行うこのスクリプトがあります。私が理解できないのは、返された文字列の改行がすべて削除されている理由です。

サンプル ファイルの内容 (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

もちろん、 fileregexnewline-2.txtは入力ファイルの正確なコピーです。しかしregexnewline-3.txt、最後に 1 つの CR-LF があり、内容が 1 行しかないのはなぜでしょうか?

heyyo heyyo heyyo\CR\LF

明らかに、ここで何かが欠けています。誰でもそれを見つけることができますか?

ところで、 MSDN に記載されているように、regex.Replace で遊んで、 を指定して 4 つの引数でオーバーロードを使用しようとしましRegexOptionsたが、スクリプトはこのメソッドに 4 つの引数のオーバーロードがないと言って失敗します。Powershell は別のバージョンの .Net フレームワークを使用していますか?

4

1 に答える 1

8

これが表示される理由は、最初にファイルから読み取ったときに $content が文字列の配列であるためです。次のように、任意の変数のタイプを確認できます。

$content.GetType().FullName

Get-Content は既定で、各要素が行を表す文字列の配列を返します。その配列を .NET の regex replace メソッドに渡すと、PowerShell は文字列配列を受け取るメソッド オーバーロードを認識しませんが、文字列を受け取るメソッド オーバーロードを認識するため、文字列配列を強制的に文字列に変換します。Get-Content 呼び出しの直後にこれを行うと、同じ効果が得られます。

"$content"

これを行うときに、PowerShell が個々の要素を連結する方法を変更することもできます。

$OFS = ", "
"$content"

.NET regex replace を使用するのではなく、正規-replace表現も処理する PowerShell の演算子を使用してみてください。

$content = $content -replace 'll','yy'
于 2013-10-09T15:35:23.423 に答える