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?

19voto

Jens A. Koch Punkte 37009

Wenn Sie arbeiten mit Git unter Windows dann schalten Sie einfach git-bash und verwenden sed . Oder, wenn Sie Windows 10 verwenden, starten Sie "Bash on Ubuntu on Windows" (aus dem Linux-Subsystem) und verwenden Sie sed .

Es handelt sich um einen Stream-Editor, aber Sie können Dateien direkt mit dem folgenden Befehl bearbeiten:

sed -i -e 's/foo/bar/g' filename
  • -i wird verwendet, um anstelle des Dateinamens zu bearbeiten.
  • -e Option gibt einen auszuführenden Befehl an.
    • s wird verwendet, um den gefundenen Ausdruck "foo" durch "bar" zu ersetzen und g wird verwendet, um alle gefundenen Übereinstimmungen zu ersetzen.

Anmerkung von ereOn:

Wenn Sie eine Zeichenkette nur in versionierten Dateien eines Git-Repositorys ersetzen möchten, können Sie diese verwenden:

git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'

was Wunder wirkt.

1 Stimmen

Beachten Sie, dass Sie, wenn Sie die Umbenennung tatsächlich in einem Git-Repository vornehmen und nur Dateien in einer bestimmten Version ersetzen wollen, dies tun können: git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g' was Wunder wirkt.

15voto

Faisal Punkte 131

Ich habe Perl verwendet, und das funktioniert wunderbar.

perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" <fileName>

.orig ist die Erweiterung, die an die Originaldatei angehängt wird

Für eine Reihe von Dateien, die wie *.html

for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x

0 Stimmen

Dies ist die einfachste Lösung +1, wenn Sie von sh nach bat konvertieren, ersetzen Sie einfach sed con perl -pi.backup -e und schätzen es :)

15voto

Simon East Punkte 50819

Ich habe mit einigen der vorhandenen Antworten hier herumgespielt und bevorzuge meine verbesserte Lösung...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }"

oder wenn Sie die Ausgabe erneut in einer Datei speichern möchten...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" > outputFile.txt

Dies hat den Vorteil, dass Sie die Ausgabe aus jedem Programm über die Pipeline einspeisen können. Ich werde auch die Verwendung von regulären Ausdrücken in Betracht ziehen. Konnte aber nicht herausfinden, wie man es in eine BAT-Datei zur einfacheren Verwendung umwandeln kann... :-(

3 Stimmen

Dies ist eine gute Lösung. Leider ist die Verwendung von type bedeutet, dass alle Zeilen mit mehr als 80 Zeichen umbrochen werden. Das ist ärgerlich.

13voto

npocmaka Punkte 52753

Mit dem ersetzer.bat

1) Mit e? Option, die spezielle Zeichenfolgen wie \n\r und Unicode-Sequenzen. In diesem Fall werden die Anführungszeichen "Foo" y "Bar" :

call replacer.bat "e?C:\content.txt" "\u0022Foo\u0022" "\u0022Bar\u0022"

2) Einfaches Ersetzen, wobei die Foo y Bar werden nicht zitiert.

call replacer.bat "C:\content.txt" "Foo" "Bar"

10voto

Chad Punkte 91

Hier ist eine Lösung, die ich unter Win XP gefunden habe. In meiner laufenden Batch-Datei habe ich Folgendes eingefügt:

set value=new_value

:: Setup initial configuration
:: I use && as the delimiter in the file because it should not exist, thereby giving me the whole line
::
echo --> Setting configuration and properties.
for /f "tokens=* delims=&&" %%a in (config\config.txt) do ( 
  call replace.bat "%%a" _KEY_ %value% config\temp.txt 
)
del config\config.txt
rename config\temp.txt config.txt

El replace.bat Datei ist wie unten dargestellt. Ich habe keine Möglichkeit gefunden, diese Funktion in dieselbe Batch-Datei einzubinden, da die %%a Variable scheint immer den letzten Wert in der for-Schleife zu liefern.

replace.bat :

@echo off

:: This ensures the parameters are resolved prior to the internal variable
::
SetLocal EnableDelayedExpansion

:: Replaces Key Variables
::
:: Parameters:
:: %1  = Line to search for replacement
:: %2  = Key to replace
:: %3  = Value to replace key with
:: %4  = File in which to write the replacement
::

:: Read in line without the surrounding double quotes (use ~)
::
set line=%~1

:: Write line to specified file, replacing key (%2) with value (%3)
::
echo !line:%2=%3! >> %4

:: Restore delayed expansion
::
EndLocal

1 Stimmen

Leider werden dabei auch Leerzeilen übersprungen. A Funktion des Befehls {{for}}.

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