bernimoses
Goto Top

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

Content-Key: 87902

Url: https://administrator.de/contentid/87902

Printed on: April 19, 2024 at 19:04 o'clock

Member: bastla
bastla May 18, 2008, updated at Oct 18, 2012 at 16:35:43 (UTC)
Goto Top
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:
@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%
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]
Member: bastla
bastla May 18, 2008 at 20:46:19 (UTC)
Goto Top
... 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
Member: bernimoses
bernimoses May 18, 2008 at 20:50:34 (UTC)
Goto Top
Also dann anstatt: do set "Zeile=%%i" & call :ProcessLine >> do echo "Zeile=%%i" & call :ProcessLine

oda was?
Danke auf jeden falls *freu*
Member: bastla
bastla May 18, 2008 at 20:55:32 (UTC)
Goto Top
... ich hatte das letzte "set" (und die Variable dahinter) in Deinem Batch gemeint, daher:
@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
Ü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
Member: bernimoses
bernimoses May 18, 2008 at 21:07:26 (UTC)
Goto Top
Du hast doch vorher gesagt das in dem textfile dann keine "!" sein dürfen. aber blöderweise sind die in meine textfile auch noch mit drin. Da ich sie nicht rauslöschen kann (weill eich dann die config zerstöre) kannst du mir bitte noch mal ein bsp. geben das jetzt genau in meine fall funktioniert?

Danke schonmal.
Member: bastla
bastla May 18, 2008 at 21:19:51 (UTC)
Goto Top
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:
@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%"  
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]
Member: bernimoses
bernimoses May 18, 2008 at 21:30:00 (UTC)
Goto Top
hm, irgendwie geht das bei mir nicht der sagt Windows script fehler: Zugriff auf windows script host wurde deaktiviert.

Was kann ich machen?
Member: bastla
bastla May 18, 2008 at 22:12:59 (UTC)
Goto Top
Hallo bernimoses!

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:§=!%
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]
Member: bernimoses
bernimoses May 19, 2008 at 12:11:08 (UTC)
Goto Top
Ich bekomms nicht hin, :'(
Jetzt löscht er zwar nicht mehr die komplette datei, schreib aber in die neue datei nur die ersten 4 zeilen der alten.
Am besten ich geb dir mal die datei. Bei der sind halt nicht die "5" zu ersetzten sondern die "X".

http://uploaded.to/?id=xptg3d

So hoffe das du mir helfen kannst.

EDIT: Ich glaub ich weis an was das liegt: In der Datei sind lauter Sonderzeichen und bei dem ersten "<" bricht er dann einfach ab. muss man die dann auch erst in ein anders zeichen umwandeln? Denk schon! Würdest du das hinbekommen? Danke
Member: bastla
bastla May 19, 2008 at 13:14:42 (UTC)
Goto Top
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:
type httpd.conf|C:\Scripts\sed s/xxxxxxxxxx/%cd%/g>test.conf

Grüße
bastla
Member: bernimoses
bernimoses May 19, 2008 at 13:24:39 (UTC)
Goto Top
hm, kann es sein dass ich sau doof bin wenn ich des in ne bat zu dan löshct er wieder alles xD
und aus der hilfe zu dem prog werd ich auch ned schlau kannste bitte nur ganz kurz die batch reinschreiben. Schonmal super spitzen mäsigen Dank an dich...

g berni
Member: bastla
bastla May 19, 2008 at 14:12:52 (UTC)
Goto Top
Hallo bernimoses!

Du brauchst nur diese eine Zeile ...

Grüße
bastla
Member: bernimoses
bernimoses May 19, 2008 at 14:23:47 (UTC)
Goto Top
hm, geht aber eben ned.

Hab die sed.exe in C:\Scripts\ getan und in die batchdas rein:

@echo off
type httpd.conf|C:\Scripts\sed s/xxxxxxxxxx/%cd%/g>test.conf


Aber das geht ned...
Er sagt immer "s inkorrekt option" *ratlos*
Member: bastla
bastla May 19, 2008 at 14:49:53 (UTC)
Goto Top
Hallo bernimoses!

Versuch es mal so:
type httpd.conf|C:\Scripts\sed s/xxxxxxxxxx/"%cd:\=\\%"/g>test.conf  

Grüße
bastla
Member: bernimoses
bernimoses May 19, 2008 at 15:36:37 (UTC)
Goto Top
Supa Danke funktioniert perfekt Danke Danke Danke... auch für die tolle Hilfe

Greets berni