2008-11-28 8 views
26

test.txt enthält Gegeben:Wie kann ich neue Zeilen mit PowerShell ersetzen?

test 
message 

Ich möchte am Ende mit:

testing 
a message 

denke ich, die folgenden sollte funktionieren, aber es funktioniert nicht:

Get-Content test.txt |% {$_-replace "t`r`n", "ting`r`na "} 

Wie kann ich Suchen und Ersetzen, wo was finde ich CRLF enthält?

Antwort

29

Eine CRLF ist zwei Zeichen, natürlich die CR und die LF. `n besteht jedoch aus beiden. Zum Beispiel:

PS C:\> $x = "Hello 
>> World" 

PS C:\> $x 
Hello 
World 
PS C:\> $x.contains("`n") 
True 
PS C:\> $x.contains("`r") 
False 
PS C:\> $x.replace("o`nW","o There`nThe W") 
Hello There 
The World 
PS C:\> 

Ich glaube, Sie laufen in Probleme mit dem `r. Ich war in der Lage, die `r aus Ihrem Beispiel zu entfernen, nur `n verwenden, und es hat funktioniert. Natürlich weiß ich nicht genau, wie Sie die ursprüngliche Saite erzeugt haben, also weiß ich nicht, was da drin ist.

16

In meinem Verständnis, beseitigt Get-Content ALLE Zeilenumbrüche/Zeilenumbrüche, wenn es Ihre Textdatei durch die Pipeline rollt. Um mehrzeilige Regexes zu erstellen, müssen Sie Ihr String-Array zu einer riesigen Zeichenfolge kombinieren. Ich mache etwas wie:

$text = [string]::Join("`n", (Get-Content test.txt)) 
[regex]::Replace($text, "t`n", "ting`na ", "Singleline") 

Klarstellung: kleine Dateien nur Leute! Bitte versuchen Sie nicht, diese auf 40   GB Protokolldatei :)

+0

Daumen nach oben für diese Erklärung –

14

Mit -Raw sollten Sie bekommen, was Sie

+1

Worth erwarten unter Hinweis darauf, dies mit PS v2 nicht verfügbar ist, aber wenn Sie Pipe zu Out-String erhalten Sie den gleichen Effekt. – Robin

+2

Ich denke, der Parameter ist da als Abhilfe für die unentschuldbare Unhöflichkeit des Befehls bei der Rückgabe von etwas anderem als was ist. +1 dafür. Ich wusste es nicht und blies 1 Stunde lang, um herauszufinden, warum meine Strings ihre Zeilenumbrüche fehlten – ekkis