Wie kann ich mit einer Batchdatei eine bestimmte Zeichenfolge aus einer Textdatei durch einen andere ersetzen?

5 Antworten

Du lässt FINDSTR jede einzelne Zeile separat nach der Zeichenfolge suchen. Wenn sie das erste Mal gefunden wird, wird sie ersetzt.

Jede Zeile wird einzeln in eine neue Datei geschrieben.

@echo off
Setlocal EnableDelayedExpansion
set Found=0
FOR /F "delims=" %%A IN ('type Datei.cs') DO (
    set CurLine=%%A
    if "!Found!" == "0" set CurLine=!CurLine:9.9.9.9=[Hiermit ersetzt]!
    echo %%A | findstr /C:"9.9.9.9" >nul 2>nul && set Found=1
    echo !CurLine!>>NeueDatei.cs
)
ping localhost -n 2 >nul
move /Y NeueDatei.cs Datei.cs
exit /b

Du musst ggf. im FOR-Befehl im TYPE-Befehl den Dateinamen korrigieren ("Datei.cs") und im IF-SET-Befehl das "[Hiermit ersetzen]" mit deiner gewünschten Zeichenfolge.

Der PING-Befehl dient dazu, dass "NeueDatei.cs" von der Festplatte definitiv erst fertiggeschrieben wird, bevor die CMD versucht sie zu verschieben.


Youkakun  04.06.2015, 15:08
  • Ist type für diesen Zweck nicht bereits ein Relikt aus alten DOS Zeiten? Die Schleife akzeptiert bereits Dateinamen auf Nicht-Uralt-Betriebssystemen.
  • Deine String-Manipulation ersetzt alle Vorkommen in der Zeile, nicht nur das erste.
  • Das wiederholte Neusetzen von Found ist nicht nötig und verlangsamt den Prozess deutlich.
  • Der lokale Ping als Wartezeit ist doch schon ein recht dreckiger Weg, schließt das Schreiben nicht die Datei nach jedem Vorgang oder wird tatsächlich asynchron geschrieben, ohne Möglichkeit auf Einfluss? (Hierbei spielt nicht die Aktualisierung des Windows Explorers eine Rolle, um die Datei visuell anzuzeigen.)
0
S1r1us13  04.06.2015, 20:09
@Youkakun

Frage: Ist TYPE nicht veraltet?
Antwort: Meines Wissens nicht, es funktioniert global einwandfrei.

Kommentar: Deine Lösung ersetzt alle Vorkommen in der Zeile, nicht nur das erste.
Antwort: Richtig, aber dafür auch nur in der ersten Zeile, die gefunden wird. Wenn du eine alternative Variante hast, die das umgeht, sag mir bitte Bescheid.

Kommentar: Das wiederholte Neusetzen von Found ist unnötig.
Antwort: Guter Kommentar. Vor den ersten ECHO-Befehl sollte daher noch ein "if "!Found!" == "0" " gepackt werden.

Frage: Ist PING wirklich nötig?
Antwort: Ja. Ich hatte schon den Fall, dass das Auslassen der Wartezeit zu Fehlern geführt hat. Grund war, dass CMD den folgenden Befehl (hier: MOVE) bereits ausführte, bevor das Schreiben der Datei beendet war.

0
Youkakun  05.06.2015, 08:52
@S1r1us13

type funktioniert zwar, ist aber wie bereits gesagt ein unnötiges Relikt in diesem Anwendungsfall. Man könnte allerdings noch begründen, dass die Datei erstmal komplett in den Arbeitsspeicher zu laden und zu zerlegen eine schnellere Ausführung gewährt statt mehrerer teurer IO Operation beim Lesen jeder einzelnen Zeile aus der Datei (Speicherverbrauch vs. Performance). Benchmarks habe ich dazu jetzt allerdings nicht.

Ersatzweise könnte man auch WScript bzw. Visual Basic nutzen, ist auch bei jedem Windows OS dabei und kann weit mehr als Batch, welches wirklich erbärmlich in String Operationen ist :/

Ein zweites if muss nicht gesetzt werden, die Zeile kann mit der vorhandenen Bedingung gruppiert werden.

Dass der move Befehl noch vor dem Abschluss der IO Operationen ausgeführt wird lässt auf ein asynchrones Schreiben schließen... eine ziemlich blöde Sache. Dann ist dein Vorschlag tatsächlich eine empfehlenswerte Lösung (glücklich macht sie mich allerdings nicht) :/

0

In Visual Studio kann man diese C#-Quell-Datei einlesen und jedes „9.9.9.9“ durch deinen „Wunschstring“ ersetzen.

Sowas ist in Programmen wie Word, Excel usw. Tagesgeschäft …

Hallo!

Es geht ist aber mit batch/cmd ziemlich kryptisch.

Ein Zeile aus der Ursprungsdatei lesen, Zeichen für Zeichen durchgehen (nach 9.9.9.9 suchen), neue Zeile zusammenbauen, diese in eine neue Datei schreiben.

Gruß

Mit der for Schleife lassen sich Textzeilen einer Datei durchlaufen (und dabei in eine neue schreiben).

for /f "delim=" %%A in ( %myinputfile% ) do (
echo %%A >> %myoutputfile%
)

Diese Zeilen sind Zeichenketten/Strings, in denen per findstr die Position herausgefunden und mit String-Manipulationen (http://www.dostips.com/DtTipsStringManipulation.php) weiter vorgegangen werden kann.

unter windows kannst du das mit einer batch datei ohne zusätzliche programme garnicht.


Thomas117 
Fragesteller
 03.06.2015, 09:31

Besteht die Möglichkeit einfach eine Zeile zu suchen und den Text dort zu ersetzen?

0
maewmaew  03.06.2015, 09:34
@Thomas117

soweit ich weiß, gibt es da unter windows standartmäßig nichts mit dem du das von der kommandozeile / batch datei aus machen kannst.

wenn du es nur einmalig machen willst und es nicht unbedingt ein batch script sein muss, kannst du einen editor wie notepad++ verwenden, in dem kannst du in allen dateien in einem ordner z.b. *.cs eine bestimmte zeichen kette durch eine andere ersetzten.

0