Batch um alle gleichen zeichenfolgen in textdatei zu ändern
hi,
ich hab folgendes Problem, ich will (wie die überschrift schon sagt) alle identischen zeichen folgen in einer Textdatei ändern.
z.B.:
Alte Textdatei:
root = 55555
doc = 55555test\
...
Neue Textdatei:
root = C:\Programme\
doc = C:\Programme\test\
...
hier hab ich wie man sieht einfach "55555" mit "C:\Programme\ ersetzt. ( nur leider bekomm ich das nicht mit einer bat hin!!!)
Der Sinn der Sache ist das Aktuelle Verzeichniss anstatt des "C:\" reinzuschreiben.
Hab auch schon das probiert:
@echo off
setlocal enabledelayedexpansion
set "filename=test.txt"
set "tempfile=temp.txt"
set "path=%cd%\"
for /F "delims=" %%a in (%filename%) do (
set text=%%a
set text=!text:55555=%path%!>>%tempfile%
)
del %filename%
ren %tempfile% test.conf
Pause
Des Teil hat mir aber dann die kompltte Datei gelehrt!!
Ich hofe doch das die Genies unter euch mir helfen können *g*
MfG bernimoses
ich hab folgendes Problem, ich will (wie die überschrift schon sagt) alle identischen zeichen folgen in einer Textdatei ändern.
z.B.:
Alte Textdatei:
root = 55555
doc = 55555test\
...
Neue Textdatei:
root = C:\Programme\
doc = C:\Programme\test\
...
hier hab ich wie man sieht einfach "55555" mit "C:\Programme\ ersetzt. ( nur leider bekomm ich das nicht mit einer bat hin!!!)
Der Sinn der Sache ist das Aktuelle Verzeichniss anstatt des "C:\" reinzuschreiben.
Hab auch schon das probiert:
@echo off
setlocal enabledelayedexpansion
set "filename=test.txt"
set "tempfile=temp.txt"
set "path=%cd%\"
for /F "delims=" %%a in (%filename%) do (
set text=%%a
set text=!text:55555=%path%!>>%tempfile%
)
del %filename%
ren %tempfile% test.conf
Pause
Des Teil hat mir aber dann die kompltte Datei gelehrt!!
Ich hofe doch das die Genies unter euch mir helfen können *g*
MfG bernimoses
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 87902
Url: https://administrator.de/forum/batch-um-alle-gleichen-zeichenfolgen-in-textdatei-zu-aendern-87902.html
Ausgedruckt am: 03.05.2025 um 08:05 Uhr
15 Kommentare
Neuester Kommentar
Hallo bernimoses!
Derlei lässt sich zwar auch mit Batch alleine bewerksteligen (zumindest solange es relativ "einfacher" Text ohne allzuviele Sonderzeichen ist), aber leichter / sicherer geht es mit einem in den Batch integrierten VBScript - für ein Beispiel (dort gleich für alle Textdateien eines Ordners) siehe: Batch zum Ändern Teile einer TXT Datei
Trotzdem Dein (ursprüngliches) Beispiel als native Batch:
Anmerkung: Leerzeilen werden in dieser einfachen Fassung nicht in die Datei "Neue.txt" übernommen.
Grüße
bastla
[Edit] Löschen der ev bereits vorhandenen Zieldatei ergänzt [/Edit]
Derlei lässt sich zwar auch mit Batch alleine bewerksteligen (zumindest solange es relativ "einfacher" Text ohne allzuviele Sonderzeichen ist), aber leichter / sicherer geht es mit einem in den Batch integrierten VBScript - für ein Beispiel (dort gleich für alle Textdateien eines Ordners) siehe: Batch zum Ändern Teile einer TXT Datei
Trotzdem Dein (ursprüngliches) Beispiel als native Batch:
@echo off & setlocal
if exist D:\Neue.txt del D:\Neue.txt
for /f "delims=" %%i in (D:\Alte.txt) do set "Zeile=%%i" & call :ProcessLine
goto :eof
:ProcessLine
>>D:\Neue.txt echo %Zeile:ich=du%
Grüße
bastla
[Edit] Löschen der ev bereits vorhandenen Zieldatei ergänzt [/Edit]
... zu Deinem nachgereichten Batch:
Abgesehen davon, dass %path% (da mit dieser - bereits vorhandenen - Systemvariable der Suchpfad auch für externe CMD-Befehle, wie etwa "xcopy", angegeben wird) kein wirklich guter Variablenname für Deinen Zweck ist (wenngleich sich in diesem kurzen Beispiel daraus noch kein Problem ergibt), wäre das letzte "set" durch ein "echo" zu ersetzen.
Außerdem sehe ich keinen Grund für die Verwendung des "tempfiles" - Du könntest gleich in "test.conf" schreiben ...
Noch eine Anmerkung: "delayedexpansion" funktioniert nur zuverlässig, wenn sich in Deiner Textdatei kein "!" befindet.
Grüße
bastla
Abgesehen davon, dass %path% (da mit dieser - bereits vorhandenen - Systemvariable der Suchpfad auch für externe CMD-Befehle, wie etwa "xcopy", angegeben wird) kein wirklich guter Variablenname für Deinen Zweck ist (wenngleich sich in diesem kurzen Beispiel daraus noch kein Problem ergibt), wäre das letzte "set" durch ein "echo" zu ersetzen.
Außerdem sehe ich keinen Grund für die Verwendung des "tempfiles" - Du könntest gleich in "test.conf" schreiben ...
Noch eine Anmerkung: "delayedexpansion" funktioniert nur zuverlässig, wenn sich in Deiner Textdatei kein "!" befindet.
Grüße
bastla
... ich hatte das letzte "set" (und die Variable dahinter) in Deinem Batch gemeint, daher:
Übrigens: Wenn schon mit %tempfile%, dann zumindest anstelle des "ren" ein "move", damit eine ev schon vorhandene "test.conf" überschrieben wird (und vielleicht doch auch noch, zur Sicherheit, %tempfile% vorweg löschen) ...
Grüße
bastla
@echo off
setlocal enabledelayedexpansion
set "filename=test.txt"
set "tempfile=temp.txt"
set "p=%cd%\"
for /F "delims=" %%a in (%filename%) do (
set text=%%a
echo !text:55555=%p%!>>%tempfile%
)
del %filename%
ren %tempfile% test.conf
Grüße
bastla
Hallo bernimoses!
Das gewünschte Beispiel steht schon (allerdings als Link) in meinem ersten Kommentar - soll heißen, dass Du mit der VBScript-Variante ein derartiges Problem nicht hättest ...
Konkrete Umsetzung für Deinen Fall:
Ersetzt wird hier immer gleich in der angegebenen %Quelle% - da Du diese ohnehin löschen willst, könntest Du sie eigentlich auch gleich im Vorhinein auf den gewünschten Namen umbenennen - im Beispiel oben erfolgt dies (per "move") erst nach den Ersetzungen ...
Grüße
bastla
[Edit] Parameter-Schreibweise in "for"-Zeile auf "%%~i" geändert [/Edit]
Das gewünschte Beispiel steht schon (allerdings als Link) in meinem ersten Kommentar - soll heißen, dass Du mit der VBScript-Variante ein derartiges Problem nicht hättest ...
Konkrete Umsetzung für Deinen Fall:
@echo off & setlocal
set "Quelle=test.txt"
set "Ziel=test.conf"
set "Von=55555"
set "Nach=%cd%\"
set R=%temp%\Repl.vbs
echo Set fso=CreateObject("Scripting.FileSystemObject"):F=WScript.Arguments(0):T=fso.OpenTextFile(F).ReadAll:fso.OpenTextFile(F,2,True).Write Replace(T,"%Von%","%Nach%")>%R%
for %%i in ("%Quelle%") do cscript //nologo %R% "%%~i"
move "%Quelle%" "%Ziel%"
Grüße
bastla
[Edit] Parameter-Schreibweise in "for"-Zeile auf "%%~i" geändert [/Edit]
Hallo bernimoses!
Hier wird zunächst jedes "!" durch ein "§" (bzw, wenn Du keinen ASCII-Editor verwendest, durch "°") ersetzt. Danach wird, unter Verwendung der ("dazugeschalteten") "delayedexpansion" die Ersetzung mit den Variablen %o% und %p% vorgenommen und abschließend (jetzt wieder ohne "delayedexpansion") werden die "!" wieder hergestellt und die Zeile gleich in die Zieldatei geschrieben.
Das Löschen der Ausgangsdatei habe ich, zumindest für die Testphase, durch "::" auskommentiert.
Grüße
bastla
[Edit] Auf Variante ohne Temporärdateien abgeändert [/Edit]
Was kann ich machen?
Wenn wir das Aktivieren des WSH einmal ausschließen wollen, fällt mir eigentlich nur etwas in der Art ein:@echo off & setlocal
set "filename=test.txt"
set "newfile=test.conf"
set "p=%cd%\"
set "o=55555"
if exist "%newfile%" del "%newfile%"
for /F "usebackq delims=" %%a in ("%filename%") do set "Zeile=%%a" & call :ProcessLine
:: del "%filename%"
goto :eof
:ProcessLine
set "Zeile=%Zeile:!=§%"
setlocal enabledelayedexpansion
set "Zeile=!Zeile:%o%=%p%!
setlocal disabledelayedexpansion
>>%newfile% echo %Zeile:§=!%
Das Löschen der Ausgangsdatei habe ich, zumindest für die Testphase, durch "::" auskommentiert.
Grüße
bastla
[Edit] Auf Variante ohne Temporärdateien abgeändert [/Edit]
Hallo bernimoses!
Es wird Zeit für etwas Vernünftiges ...
Wenn es kein VBScript sein darf, lade Dir zB von hier eine Windows-Version von "sed" herunter, lege die "sed.exe" in einen beliebigen Ordner (in meinem Beispiel unten wäre das "C:\Scripts") und verwende folgende Zeile:
Grüße
bastla
Es wird Zeit für etwas Vernünftiges ...
Wenn es kein VBScript sein darf, lade Dir zB von hier eine Windows-Version von "sed" herunter, lege die "sed.exe" in einen beliebigen Ordner (in meinem Beispiel unten wäre das "C:\Scripts") und verwende folgende Zeile:
type httpd.conf|C:\Scripts\sed s/xxxxxxxxxx/%cd%/g>test.conf
Grüße
bastla