datei durchsuchen und Zeile ändern
datei durchsuchen und Zeile ändern
Hallo
habe folgendes Problem
Ich müsste eine Datei (test.cfg) nach einem Wort (suchmich) durchsuchen und dann die Zahl (ändert sich von Tag zu Tag) rechts vom Wort (suchmich) ändern.
das suchen mit For in der Art
for /f %%i in ('find "suchmich" test.cfg) do set zeichen=%%i
glaube ich bringe ich noch hin, aber ich will ja die Zahl Rechts von "suchmich" (die ja nie gleich ist) ändern
(die Zeile heisst z.B suchmich = 2131536536;)
wobei sich die Zahl ja von Tag zu Tag ändert.
Das heisst, das Script müsste die Datei zeilenweise durchsuchen bis es das Wort Suchmich gefunden hat, dann alles Rechts davon löschen und durch meine vorgegeben Zahl ersetzen.
Ich hoffe Ihr könnt mir helfen.
PS:sollte ein Batch-script sein wenn möglich (win2k)
Hallo
habe folgendes Problem
Ich müsste eine Datei (test.cfg) nach einem Wort (suchmich) durchsuchen und dann die Zahl (ändert sich von Tag zu Tag) rechts vom Wort (suchmich) ändern.
das suchen mit For in der Art
for /f %%i in ('find "suchmich" test.cfg) do set zeichen=%%i
glaube ich bringe ich noch hin, aber ich will ja die Zahl Rechts von "suchmich" (die ja nie gleich ist) ändern
(die Zeile heisst z.B suchmich = 2131536536;)
wobei sich die Zahl ja von Tag zu Tag ändert.
Das heisst, das Script müsste die Datei zeilenweise durchsuchen bis es das Wort Suchmich gefunden hat, dann alles Rechts davon löschen und durch meine vorgegeben Zahl ersetzen.
Ich hoffe Ihr könnt mir helfen.
PS:sollte ein Batch-script sein wenn möglich (win2k)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 13919
Url: https://administrator.de/contentid/13919
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
6 Kommentare
Neuester Kommentar
Moin, Farmer,
kann man/frau als reinen Batch machen, aber eher zu reinen Tutorial-Zwecken.
Ich würde dennoch auf ein Change/FindReplace-Replace-Utility zurückgreifen.
P.S. Es gab in der letzte Wochen schon zwei fast gleiche Anfragen (Text ersetzen mit Batch-Bordmitteln) - ist irgendwo ein Preisausschreiben mit diesen Thema angesetzt?
Strategie über Batch wäre nämlich etwas umständlich:
0. Als Parameter sollte minimal %neuerText% kommen, also z.B.
<font color=green>set neuerText=%1 </font>
1. Zeilennummer der zu ändernden Textzeile ermitteln und in Tempdatei schreiben.
Wobei natürlich suchmich, textdatei aus Variablen/Parametern ermittelt worden sein könnten.
<font color=green>Find /n "suchmich" textdatei >tempdatei </font>
2. Zeilennummer in Variable merken
<font color=green>For /F "delims= skip=2 " %%a in (tempdatei) do set Zeilennummer=%%a </font>
(Ergebnis: %Zeilennummer%=234 ....oder ähnlich)
3. Die Zeile mit dem "suchmich" selbst Wort für Wort bzw. Token für Token zerlegen und in Variablen "merken"
<font color=green>Find "suchmich" textdatei >tempdatei</font> ...diesmal die Zeile selbst in tempdatei
<font color=green>set /a cnt=0
for /F "skip=2 Delims=" %%a in (tempdatei) do call :loop %%a
:Loop</font>
[edit] Dieses For /L funktioniert nicht :---- For /L %%b In (1,1,9) do set Token%%b=%%%b [/edit]
<font color=green>set /a cnt=%cnt%+1
set Token%cnt%=%1
goto :eof
...</font>
4. den TokenX ermitteln, der gleich suchmich ist; TokenX+1 ersetzen mit dem neuen Text
<font color=green>For /L %%b In (1,1,9) do if (Token%%b)==(suchmich) Set /a TokenY=%%b+1
Set Token%TokenY%=%neuertext%</font>
5 . wieder eine ganze Zeile daraus machen. ..%Zeileneu%
<font color=green>Set Zeileneu=%Token1% %Token2% %Token3% %Token4% ...</font>
(als Delimiter hab ich Leerzeichen unterstellt, sonst bei Punkt 3 z.B delims=; angeben und hier statt Leerzeichen natürlich Semikolon angeben)
6. die Textdatei(orig) lesen und schreiben bis Zeile (Zeilennummer% minus 1) in NeuDatei
auch wieder mit einem "For /F"- Konstrukt... und einem Zähler bis %Zeilennummer% -1...
das kennen wir ja jetzt... und alles > NeuDatei
7. Zeile %Zeileneu% in NeuDatei schreiben
8. Rest aus Textdatei(orig) in Neudatei schreiben.
9 Sichern TextDatei(orig), Rename NeuDatei in TextDatei.
Ich kann mal sowas als Tutorial zusammenbürsten, aber ich würde das NIE im Echtbetrieb einsetzen... so einen Batch kann keiner pflegen oder nachvollziehen, wenn der Admin im Urlaub ist. Das heißt, wenn Admins Urlaub bekämen *seufz
Frank / der Biber aus Bremen
kann man/frau als reinen Batch machen, aber eher zu reinen Tutorial-Zwecken.
Ich würde dennoch auf ein Change/FindReplace-Replace-Utility zurückgreifen.
P.S. Es gab in der letzte Wochen schon zwei fast gleiche Anfragen (Text ersetzen mit Batch-Bordmitteln) - ist irgendwo ein Preisausschreiben mit diesen Thema angesetzt?
Strategie über Batch wäre nämlich etwas umständlich:
0. Als Parameter sollte minimal %neuerText% kommen, also z.B.
<font color=green>set neuerText=%1 </font>
1. Zeilennummer der zu ändernden Textzeile ermitteln und in Tempdatei schreiben.
Wobei natürlich suchmich, textdatei aus Variablen/Parametern ermittelt worden sein könnten.
<font color=green>Find /n "suchmich" textdatei >tempdatei </font>
2. Zeilennummer in Variable merken
<font color=green>For /F "delims= skip=2 " %%a in (tempdatei) do set Zeilennummer=%%a </font>
(Ergebnis: %Zeilennummer%=234 ....oder ähnlich)
3. Die Zeile mit dem "suchmich" selbst Wort für Wort bzw. Token für Token zerlegen und in Variablen "merken"
<font color=green>Find "suchmich" textdatei >tempdatei</font> ...diesmal die Zeile selbst in tempdatei
<font color=green>set /a cnt=0
for /F "skip=2 Delims=" %%a in (tempdatei) do call :loop %%a
:Loop</font>
[edit] Dieses For /L funktioniert nicht :---- For /L %%b In (1,1,9) do set Token%%b=%%%b [/edit]
<font color=green>set /a cnt=%cnt%+1
set Token%cnt%=%1
goto :eof
...</font>
4. den TokenX ermitteln, der gleich suchmich ist; TokenX+1 ersetzen mit dem neuen Text
<font color=green>For /L %%b In (1,1,9) do if (Token%%b)==(suchmich) Set /a TokenY=%%b+1
Set Token%TokenY%=%neuertext%</font>
5 . wieder eine ganze Zeile daraus machen. ..%Zeileneu%
<font color=green>Set Zeileneu=%Token1% %Token2% %Token3% %Token4% ...</font>
(als Delimiter hab ich Leerzeichen unterstellt, sonst bei Punkt 3 z.B delims=; angeben und hier statt Leerzeichen natürlich Semikolon angeben)
6. die Textdatei(orig) lesen und schreiben bis Zeile (Zeilennummer% minus 1) in NeuDatei
auch wieder mit einem "For /F"- Konstrukt... und einem Zähler bis %Zeilennummer% -1...
das kennen wir ja jetzt... und alles > NeuDatei
7. Zeile %Zeileneu% in NeuDatei schreiben
8. Rest aus Textdatei(orig) in Neudatei schreiben.
9 Sichern TextDatei(orig), Rename NeuDatei in TextDatei.
Ich kann mal sowas als Tutorial zusammenbürsten, aber ich würde das NIE im Echtbetrieb einsetzen... so einen Batch kann keiner pflegen oder nachvollziehen, wenn der Admin im Urlaub ist. Das heißt, wenn Admins Urlaub bekämen *seufz
Frank / der Biber aus Bremen
Das würde ein paar Schritte sparen, Farmer,
Aber dieses Zerlegen in Token und wieder Zusammenfrickeln der Zeile bleibt Dir nicht erspart, wenn es ohne Text-Ersetz-Utilities laufen soll.
Und auch nicht das Schreiben der Textdatei von Zeile 1 bis (ZeileNeu-1) +Schreiben ZeileNeu + Schreiben (ZeileNeu+1)...
.. sorry, das sind die Bordmittel.
Meines Wissens jedenfalls. Deshalb nimm lieber ein fertiges ChangeText-Utility.
Biber
Aber dieses Zerlegen in Token und wieder Zusammenfrickeln der Zeile bleibt Dir nicht erspart, wenn es ohne Text-Ersetz-Utilities laufen soll.
Und auch nicht das Schreiben der Textdatei von Zeile 1 bis (ZeileNeu-1) +Schreiben ZeileNeu + Schreiben (ZeileNeu+1)...
.. sorry, das sind die Bordmittel.
Meines Wissens jedenfalls. Deshalb nimm lieber ein fertiges ChangeText-Utility.
Biber
siehe z.B. die Links der aktuellen Threads:
Tool zum ersetzten von wörtern und texten in dateien
Batch Programmierung, Dateiinhalt manipulieren
Ein voll ausreichendes Tool für Deinen Zweck ist das dort erwähnte Change-Utility
http://guymal.com/techCorner/Batch_File_Syntax.shtml
Andere beliebte (aber überdimensionierte) heißen FindRepl.exe oder "Search & Replace"..
frag Dr. Google.
Tool zum ersetzten von wörtern und texten in dateien
Batch Programmierung, Dateiinhalt manipulieren
Ein voll ausreichendes Tool für Deinen Zweck ist das dort erwähnte Change-Utility
http://guymal.com/techCorner/Batch_File_Syntax.shtml
Andere beliebte (aber überdimensionierte) heißen FindRepl.exe oder "Search & Replace"..
frag Dr. Google.
..übrigens,
wenn die zu ändernde Zeile in der test.cfg tatsächlich immer die Zeile 1467 ist..
... und die Suchzeile wirklich nur aus "suchmich=nnnnnnnnnnn" besteht
dann geht es auch mit dem edlin... der wird immer noch mitgeliefert
---minibatch (ohne alle prüfungen) --einzige Funktion Zeile 1467 durch "suchmich=nnnnNeu" ersetzen
@echo off
Set suchmich=DeinSuchtext
set NeuerWert=12345678
set inputfile=%temp%\edlininput.text
echo 1467 >%inputfile%
echo %suchmich%=%NeuerWert% >>%inputfile%
echo e >>%inputfile%
edlin test.cfg<%inputfile%
--- end of minibatch
Biber
[edit] einen Tach später
oder, wenigstens ein kleines bisschen variabler:
minibatch2
@echo off
Set suchmich=DeinSuchtext
set NeuerWert=12345678
find "%suchmich%" test.cfg
if errorlevel 1 goto end <font color=green>nur wenn suchmich in test.cfg gefunden wird</font>
set inputfile=%temp%\edlininput.text
echo s%suchmich% >%inputfile% ...... <font color=green>suchmich suchen</font>
echo d >>%inputfile% ..............<font color=green>diese Zeile löschen</font>
echo i >>%inputfile% ...............<font color=green>Zeile neu einfügen</font>
echo %suchmich%=%NeuerWert% >>%inputfile%
echo e >>%inputfile%
edlin test.cfg<%inputfile%
:end
--- end of minibatch2
[/edit]
wenn die zu ändernde Zeile in der test.cfg tatsächlich immer die Zeile 1467 ist..
... und die Suchzeile wirklich nur aus "suchmich=nnnnnnnnnnn" besteht
dann geht es auch mit dem edlin... der wird immer noch mitgeliefert
---minibatch (ohne alle prüfungen) --einzige Funktion Zeile 1467 durch "suchmich=nnnnNeu" ersetzen
@echo off
Set suchmich=DeinSuchtext
set NeuerWert=12345678
set inputfile=%temp%\edlininput.text
echo 1467 >%inputfile%
echo %suchmich%=%NeuerWert% >>%inputfile%
echo e >>%inputfile%
edlin test.cfg<%inputfile%
--- end of minibatch
Biber
[edit] einen Tach später
oder, wenigstens ein kleines bisschen variabler:
minibatch2
@echo off
Set suchmich=DeinSuchtext
set NeuerWert=12345678
find "%suchmich%" test.cfg
if errorlevel 1 goto end <font color=green>nur wenn suchmich in test.cfg gefunden wird</font>
set inputfile=%temp%\edlininput.text
echo s%suchmich% >%inputfile% ...... <font color=green>suchmich suchen</font>
echo d >>%inputfile% ..............<font color=green>diese Zeile löschen</font>
echo i >>%inputfile% ...............<font color=green>Zeile neu einfügen</font>
echo %suchmich%=%NeuerWert% >>%inputfile%
echo e >>%inputfile%
edlin test.cfg<%inputfile%
:end
--- end of minibatch2
[/edit]