HOWTO · Batch

So ersetzen Sie Text aus einer Datei in einem Batch-Skript

Erfahren Sie, wie Sie Text in einer Datei unter Windows mit einem Batch-Skript, PowerShell oder einer installierten sed-Portierung ersetzen.

Auf dieser Seite

Um übereinstimmenden Text in einer Datei von einer Windows-Befehlszeile aus zu ersetzen, schreiben Sie den umgewandelten Inhalt in eine separate Datei und prüfen Sie ihn, bevor Sie ihn anstelle der Quelle verwenden. Ein Batch-Skript kann einfache wörtliche Ersetzungen ausführen, PowerShell bietet musterbasierte Ersetzung, und sed ist eine Option, wenn eine Windows-Portierung installiert ist. Die Beispiele verwenden eine kleine Textdatei und ersetzen sample durch modified.

Text mit einem Windows-Batch-Skript ersetzen

Dieses Batch-Beispiel erstellt seine eigene temporäre Eingabe, verarbeitet jede nicht leere Zeile und schreibt das Ergebnis in eine separate Ausgabedatei. Anschließend zeigt es die Ausgabe an und entfernt seine temporären Dateien. Die vorhandene englische Referenz zum echo-Befehl erklärt den Befehl, mit dem jede Zeile geschrieben wird. findstr kann dabei helfen, übereinstimmende Zeilen vor oder nach einer Änderung zu finden, aber es sucht; es ersetzt keinen Text.

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "work=%TEMP%\batch-replace-%RANDOM%"
md "%work%"
set "inputFile=%work%\input.txt"
set "outputFile=%work%\output.txt"
> "%inputFile%" echo sample text, ready
>> "%inputFile%" echo keep this line
set "search=sample"
set "replace=modified"
(for /f "usebackq delims=" %%L in ("%inputFile%") do (
    set "line=%%L"
    set "line=!line:%search%=%replace%!"
    echo !line!
)) > "%outputFile%"
type "%outputFile%"
del "%inputFile%" "%outputFile%"
rmdir "%work%"
endlocal

for /f "usebackq delims=" %%L in ("%inputFile%") do ... liest Zeilen, die verzögerte Erweiterung wendet eine wörtliche Ersetzung an, und die Umleitung der Schleife schreibt das Ergebnis in eine andere Datei. Dieses einfache Muster überspringt leere Zeilen, und die verzögerte Erweiterung kann Zeilen verändern, die ! enthalten. Halten Sie Such- und Ersetzungswerte einfach, da die Batch-Erweiterung Regeln für Sonderzeichen hat; verwenden Sie PowerShell, wenn die genaue Erhaltung der Zeilen oder komplexerer Text wichtig ist.

Text mit PowerShell ersetzen

PowerShell ist auf vielen Windows-Systemen verfügbar und eignet sich gut, wenn die Datei leere Zeilen oder Zeichen enthalten kann, die die Batch-Erweiterung erschweren. Dieses in sich geschlossene Beispiel erstellt die Beispieleingabe, ersetzt sample durch modified, schreibt UTF-8 ohne Byte-Order-Mark, zeigt das Ergebnis an und entfernt sein temporäres Verzeichnis.

$work = Join-Path ([IO.Path]::GetTempPath()) ([guid]::NewGuid().ToString())
New-Item -ItemType Directory -Path $work | Out-Null
$inputFile = Join-Path $work 'input.txt'
$outputFile = Join-Path $work 'output.txt'
[IO.File]::WriteAllText($inputFile, "sample text, ready`nkeep this line`n")
$text = [IO.File]::ReadAllText($inputFile)
$result = $text -replace 'sample', 'modified'
$utf8 = New-Object System.Text.UTF8Encoding -ArgumentList $false
[IO.File]::WriteAllText($outputFile, $result, $utf8)
Get-Content -LiteralPath $outputFile
Remove-Item -LiteralPath $work -Recurse -Force
modified text, ready
keep this line

Der Operator -replace behandelt sein erstes Operand als regulären Ausdruck, und die Übereinstimmung erfolgt standardmäßig ohne Berücksichtigung der Groß- und Kleinschreibung. Für eine wörtliche Suchzeichenfolge, die Regex-Metazeichen enthält, escapen Sie sie mit [regex]::Escape($search); verwenden Sie -creplace, wenn die Groß- und Kleinschreibung eine Rolle spielen soll. Der explizite UTF-8-Writer vermeidet es, sich auf versionsspezifische Standardwerte zu verlassen. Prüfen Sie die Ausgabedatei, bevor Sie das Original ersetzen.

Text mit sed unter Windows ersetzen

sed ist nicht in jeder Windows-Installation enthalten. Verwenden Sie es nur, wenn eine Windows-Portierung installiert ist und auf PATH verfügbar ist. Seine Ersetzungsform ist s/search/replacement/g; für dieses Beispiel führen Sie sed "s/sample/modified/g" "input.txt" > "output.txt" aus. Das Flag g ersetzt jede Übereinstimmung in jeder Zeile, während die Umleitung die Quelle vom Ergebnis getrennt hält.

Die Such- und Ersetzungswerte werden von sed interpretiert, daher müssen Zeichen wie /, & und Backslashes möglicherweise escapet werden. Prüfen Sie die Quoting-Regeln der gewählten Portierung, wenn Werte Shell-Sonderzeichen enthalten, und prüfen Sie die Ausgabe, bevor Sie sie als Quelle verwenden.

Eine Methode wählen und die Eingabedatei schützen

Für eine kurze, einfache Ersetzung, bei der leere Zeilen und Ausrufezeichen keine Rolle spielen, vermeidet die Batch-Schleife eine zusätzliche Skriptabhängigkeit. PowerShell ist ein praktischer Standard, wenn wörtlicher Text, Regex-Verhalten oder die Kodierung kontrolliert werden müssen. Wählen Sie sed, wenn eine Windows-Portierung bereits verfügbar ist und ihre Ersetzungssyntax zu den Daten passt.

Jede Methode sollte in einen anderen Ausgabepfad schreiben, damit die Eingabe intakt bleibt, während die Umwandlung läuft. Vergleichen Sie die Ausgabe mit der Quelle und bestätigen Sie die erwartete Kodierung, bevor Sie das Original ersetzen. Wenn die Datei wichtige Daten enthält, erstellen Sie zuerst ein Backup; die Umleitung der Ausgabe auf denselben Pfad, der gelesen wird, kann die Eingabe abschneiden, bevor die Verarbeitung abgeschlossen ist.