2012-04-04 11 views
3

Angenommen, die einfache Substitution Datei unter:Wie steuert man den Zeilentrenner in einer Powershell-Pipeline?

get-content db.cfg | %{$_ -replace 'a', 'b'} | out-file db.cfg.new -encoding default 

out-Datei automatisch \ r \ n als Zeilen Separator verwendet. Gibt es eine Möglichkeit, ein anderes Trennzeichen (wie \ n) zu erzwingen?

Ich suche eine elegante Lösung. Ansonsten kann man die ganze Datei sicherlich als String im Speicher aufbauen und dann aufschreiben.

Antwort

3

könnten Sie Streamwriter anstelle des Cmdlet Out-File wie folgt aus:

$writer = [system.io.file]::CreateText("\path\to\db.cfg.new") 
$writer.NewLine = "`n" 
get-content db.cfg | %{$_ -replace 'a', 'b'} | % { $writer.WriteLine($_)} 
$writer.Close() 

Es ist nicht ganz so glatt wie ein Einzeiler, aber zumindest ist es leicht zu lesen und Sie Streaming noch die feile jeweils eine Zeile ein.

+0

Ich mag das. Und ich könnte meine eigene out-file2-Funktion erstellen, die die Details dieses Codes verbirgt und so glatt wie die ursprüngliche ist. –

+0

Absolut! Beachten Sie, dass das aktuelle PowerShell-Verzeichnis und das aktuelle Verzeichnis des Prozesses nicht unbedingt identisch sind. Verwenden Sie daher vollständige Pfade oder legen Sie [Environment] :: CurrentDirectory fest, bevor Sie die Datei öffnen. –

0

Wie sieht es mit der Konvertierung nach der Erstellung aus?

$fileToConvert = "db.cfg.new" 
$filName = "db.cfg" 

$text = ([IO.File]::ReadAllText($fileToConvert) -replace "`r`n?", "`n") 
$encoding = New-Object System.Text.ASCIIEncoding 
[IO.File]::WriteAllText("$filename", $text, $encoding) 
+1

Dies wäre noch weniger elegant, als an einer Liste von Zeilen zu arbeiten und sie dann mit dem Trennzeichen der Wahl zu verbinden. Ich hatte gehofft, es gibt einige undokumentierte $ LINE_SEPARATOR, die angepasst werden können. –

0

Es scheint, als ob es nicht möglich ist, den Zeilentrenner zu steuern, wenn Out-File am Ende einer Pipeline verwendet wird.

Aber natürlich können Sie die Datei als Zeichenfolge im Speicher erstellen oder die Zeilenenden nach dem Speichern der Datei konvertieren.

Ich löste meinen Anwendungsfall mit Swiss File Knife anstelle von PowerShell, um die Substitution durchzuführen. Es fühlte sich einfach nicht richtig an, einen Workaround für solch ein grundlegendes Problem zu implementieren.

Verwandte Themen