615 Stimmen

Wie können Sie mit der Windows-Befehlszeilenumgebung Text in einer Datei suchen und ersetzen?

Ich schreibe ein Stapeldatei-Skript mit der Windows-Befehlszeilenumgebung und möchte jedes Vorkommen eines Textes in einer Datei (z. B. "FOO") durch einen anderen (z. B. "BAR") ersetzen. Wie lässt sich das am einfachsten bewerkstelligen? Gibt es eingebaute Funktionen?

443voto

Rachel Punkte 126340

Viele der Antworten hier haben mir geholfen, in die richtige Richtung zu gehen, aber keine war für mich geeignet, also poste ich meine Lösung.

Ich habe Windows 7, das mit integrierter PowerShell geliefert wird. Hier ist das Skript, das ich verwendet habe, um alle Instanzen von Text in einer Datei zu suchen/ersetzen:

powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt"

Um es zu erklären:

  • powershell startet die Datei powershell.exe, die in Windows 7 enthalten ist
  • -Command "... " ist ein Befehlszeilenarg für powershell.exe, das den auszuführenden Befehl enthält
  • (gc myFile.txt) liest den Inhalt von myFile.txt ( gc ist die Abkürzung für die Get-Content Befehl)
  • -replace 'foo', 'bar' führt einfach den Befehl replace aus und ersetzt foo avec bar
  • | Out-File myFile.txt leitet die Ausgabe in die Datei myFile.txt
  • -encoding ASCII verhindert die Transkription der Ausgabedatei in Unicode, wie in den Kommentaren hervorgehoben wird

Powershell.exe sollte bereits Teil Ihrer PATH-Anweisung sein, aber wenn nicht, können Sie es hinzufügen. Der Speicherort auf meinem Rechner ist C:\WINDOWS\system32\WindowsPowerShell\v1.0

更新情報
Offensichtlich ist in modernen Windows-Systemen PowerShell integriert, so dass Sie direkt darauf zugreifen können, indem Sie

(Get-Content myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt

82 Stimmen

Achtung, dieser Befehl kann die Datei auch in eine Unicode-Kodierung umwandeln. Sie können die Kodierung manuell angeben, indem Sie -encoding ASCII o UTF8 oder was auch immer benötigt wird. Beachten Sie auch, dass bei der Verwendung von UTF8 ein Byte Order Mark am Anfang der Datei eingefügt werden kann, das in der Originaldatei nicht vorhanden war.

85 Stimmen

@Wyck Ich habe eine Weile gebraucht, um herauszufinden, wo ich die -encoding ASCII . Für alle, die es in Zukunft brauchen, wäre es Out-File -encoding ASCII myFile.txt

20 Stimmen

Das einzige, was ich ändern musste, war die Verwendung von Set-Content anstelle von Out-File .

188voto

Mike Schall Punkte 5741

Wenn Sie mit einer Windows-Version arbeiten, die .Net 2.0 unterstützt, würde ich Ihre Shell ersetzen. PowerShell bietet Ihnen die volle Leistungsfähigkeit von .Net über die Befehlszeile. Es sind auch viele Commandlets eingebaut. Das folgende Beispiel wird Ihre Frage beantworten. Ich verwende die vollständigen Namen der Befehle, es gibt kürzere Aliasnamen, aber so haben Sie etwas, wonach Sie googeln können.

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt

2 Stimmen

Ich stimme ebenfalls für PowerShell. Es gibt Ihnen nur eine extrem fähige Shell.

14 Stimmen

Ich kann sehen, dass PowerShell in der Lage ist, dies zu erreichen. Aber wie kann ich dies aus einer Batch-Datei (Beispiel: myProc.bat) ausführen lassen?

3 Stimmen

@Pablo, verwenden Sie powershell.exe und packen Sie den Befehl ps in einen einzigen Parameter

183voto

VonC Punkte 1117238

Gerade benutzt FART (" F ind A und R eplace T ext" Kommandozeilenprogramm):
Ausgezeichnete kleine Freeware zum Ersetzen von Text in einer großen Anzahl von Dateien.

Die Setup-Dateien sind auf SourceForge .

Beispiel für die Verwendung:

fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools

eine Vorschau der Ersetzungen, die rekursiv in den Dateien dieser Perl-Distribution vorgenommen werden sollen.

Einziges Problem: Das Symbol der FART-Website ist nicht gerade geschmackvoll, raffiniert oder elegant ;)


Update 2017 (7 Jahre später) jagb weist darauf hin in den Kommentaren zum Artikel 2011 " FARTing the Easy Way - Suchen und Ersetzen von Text " aus Mikail Tunç


Wie bereits von Joe Jobs en die Kommentare (Dez. 2020), wenn Sie die &A zum Beispiel müssten Sie Anführungszeichen verwenden, um sicherzustellen, dass & wird von der Shell nicht interpretiert:

fart in.txt "&A" "B"

23 Stimmen

Das Tolle daran ist, dass es sich um eine einzige Exe handelt. Keine Abhängigkeiten. Kein Kleingedrucktes. Super einfach zu verteilen.

1 Stimmen

Danke für die Furz-Empfehlung. Scheint gut zu funktionieren, obwohl ich wünschte, es unterstützt Regex.

2 Stimmen

Sehr leicht und einfach zu bedienen, aber ich hatte gehofft, dass es die genauen Stellen ausdrucken würde, an denen die Ersetzungen stattgefunden haben. Das nicht sehen zu können, gab mir ein Gefühl der Unsicherheit.

145voto

Bill Richardson Punkte 1463

Replace - Ersetzen einer Teilzeichenkette mit Hilfe von String-Substitution Beschreibung: Um eine Teilzeichenkette durch eine andere Zeichenkette zu ersetzen, verwenden Sie die Funktion zur Stringsubstitution. Das hier gezeigte Beispiel ersetzt alle Vorkommen von "teh" durch "the" in der String-Variablen str.

set str=teh cat in teh hat
echo.%str%
set str=%str:teh=the%
echo.%str%

Skript-Ausgabe:

teh cat in teh hat
the cat in the hat

ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

33 Stimmen

Inwiefern ist der sed-Vorschlag besser? Dies scheint die einfachste Antwort von allen zu sein, und es muss nichts installiert werden.

5 Stimmen

Kann hier eine Art Mustervergleich durchgeführt werden? Wildcards, Regex usw.?

32 Stimmen

"Wie kann der Sed-Vorschlag besser sein?" - sed und ähnliche Hilfsprogramme arbeiten mit Dateien; dieses Snippet lässt den wichtigen Schritt des Lesens von Zeilen aus der Eingabedatei und des Schreibens in die Ausgabedatei aus und stellt gleichzeitig sicher, dass alle Sonderzeichen in der Datei korrekt behandelt werden.

63voto

user459118 Punkte 1084

Erstellen Sie die Datei replace.vbs:

Const ForReading = 1    
Const ForWriting = 2

strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strText = objFile.ReadAll
objFile.Close

strNewText = Replace(strText, strOldText, strNewText)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText  'WriteLine adds extra CR/LF
objFile.Close

Um dieses überarbeitete Skript (das wir replace.vbs nennen) zu verwenden, geben Sie in der Eingabeaufforderung einen ähnlichen Befehl ein wie diesen:

cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "

0 Stimmen

Dies ist ordentlich, erlaubt es die Verwendung von RegEx?

3 Stimmen

@user280109 Ja, VBScript unterstützt RegExp . Sie können dies zum Ersetzen mit einem regulären Ausdruck verwenden: With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With . Sie können den Text der ersten 9 Erfassungsgruppen abrufen, indem Sie $1 , $2 ... $9 .

3 Stimmen

VBScript wird oft übersehen (und gehasst), ist aber auf allen Windows-Plattformen verfügbar, sehr gut lesbar und hat tatsächlich sehr leistungsfähige Funktionen +1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X