farmer
Goto Top

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)

Content-ID: 13919

Url: https://administrator.de/forum/datei-durchsuchen-und-zeile-aendern-13919.html

Ausgedruckt am: 22.12.2024 um 23:12 Uhr

Biber
Biber 02.08.2005 um 14:03:15 Uhr
Goto Top
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 &gt 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
Farmer
Farmer 02.08.2005 um 16:43:34 Uhr
Goto Top
Hallo
wenn es leichter ist, könnte man auch sagen das script soll, jedesmal wenn es gestartet wurde, von der datei Test.cfg die Zeile 1467 durch einen Text "neuertext" erssetzen

(Das script wird im Taskplaner zu einem gewissen Zeitpunkt gestartet)
Biber
Biber 02.08.2005 um 17:12:39 Uhr
Goto Top
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
Farmer
Farmer 02.08.2005 um 17:16:33 Uhr
Goto Top
wo bekomme ich so etwas her???
Biber
Biber 02.08.2005, aktualisiert am 17.10.2012 um 15:44:29 Uhr
Goto Top
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.
Biber
Biber 03.08.2005 um 13:20:54 Uhr
Goto Top
..ü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
face-wink 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]