Textdateien öffnen, Suchmuster finden, dahinter eine Zeile einfügen, abspeichern
Erstmal "Hallo zusammen", das ist mein erster Post hier im Forum und ich hoffe ich hab die SuFu ausreichend gequält, nicht dass ich doch einen Thread gleich zum Einstieg verstolpert habe.. Und nu zum eigentlich Thema ;)
Ich habe einen ganzen Sack voll Textdateien, die einen solchen Aufbau besitzen:
[txt]
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares,
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares
<MEIN-SUCHMUSTER>
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares,
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares
[/txt]
In die Zeile UNTER <MEIN-SUCHMUSTER> soll nun eine neue Zeile eingefügt werden mit "MEIN-TEXT".
Das heißt ich möchte eigentlich nur nach <MEIN-SUCHMUSTER> suchen und eine neue Zeile dahinter "MEIN-TEXT" schreiben. Danach soll die Datei natürlich noch gespeichert werden.
Das Ganze soll nun für einige 1000 Dateien passieren, was bedeutet, dass ich noch ein Konstrukt drumherum brauche, was einfach alle *.txt-Dateien in einem Verzeichnis durchklappert.
Tausend Dank demjenigen, der mir weiterhelfen kann!
//edit:
Ein zusätzliche Schwierigkeit gibts außerdem noch:
Die Dateien liegen nicht alle in einem Verzeichnis, sondern in mehreren -> Aufbau:
Wenn das noch berücksichtigt werden könnte.. Wäre super
Ich habe einen ganzen Sack voll Textdateien, die einen solchen Aufbau besitzen:
[txt]
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares,
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares
<MEIN-SUCHMUSTER>
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares,
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares
[/txt]
In die Zeile UNTER <MEIN-SUCHMUSTER> soll nun eine neue Zeile eingefügt werden mit "MEIN-TEXT".
Das heißt ich möchte eigentlich nur nach <MEIN-SUCHMUSTER> suchen und eine neue Zeile dahinter "MEIN-TEXT" schreiben. Danach soll die Datei natürlich noch gespeichert werden.
Das Ganze soll nun für einige 1000 Dateien passieren, was bedeutet, dass ich noch ein Konstrukt drumherum brauche, was einfach alle *.txt-Dateien in einem Verzeichnis durchklappert.
Tausend Dank demjenigen, der mir weiterhelfen kann!
//edit:
Ein zusätzliche Schwierigkeit gibts außerdem noch:
Die Dateien liegen nicht alle in einem Verzeichnis, sondern in mehreren -> Aufbau:
root|-abc -frt.txt -342.txt -we3.txt -ew.txt|-def -sd.txt -sds.txt -3hr.txt|-34v -34d.txt -3ds.txt|-3f3 -sd.txt -34d.txt -3ds.txt -sds.txt
Wenn das noch berücksichtigt werden könnte.. Wäre super
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 90982
Url: https://administrator.de/forum/textdateien-oeffnen-suchmuster-finden-dahinter-eine-zeile-einfuegen-abspeichern-90982.html
Ausgedruckt am: 20.05.2025 um 19:05 Uhr
12 Kommentare
Neuester Kommentar
Hallo mmenzel!
Dann etwa so:
Da die Ersetzung in den bestehenden Dateien ohne Sicherungskopie erfolgt, bitte zum Testen nur Kopien verwenden.
Bei der Suche wird Groß-/Kleinschreibung nicht unterschieden. Falls der Suchbegriff nicht gefunden wurde, erfolgt eine Fehlermeldung.
Grüße
bastla
Dann etwa so:
@echo off & setlocal
set "Ordner=D:\Test"
set "Dateien=*.txt"
set "Suchbegriff=dieser-text-ist-immer-gleich"
set "Zusatzzeile=DIE NEUE ZEILE"
set "IL=%temp%\InsertLine.vbs"
echo Set args = WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject")>%IL%
echo T=fso.OpenTextFile(args(0)).ReadAll:P=InStr(1,T,args(1),vbTextCompare):If P=0 Then WScript.Quit 1 >>%IL%
echo P=InStr(P,T,vbCrLF):If P^<^>0 Then fso.CreateTextFile(args(0)).Write Left(T,P-1)^&vbCrLF^&args(2)^&Mid(T,P)>>%IL%
for %%i in ("%Ordner%\%Dateien%") do cscript //nologo %IL% "%%i" "%Suchbegriff%" "%Zusatzzeile%" || echo Keine Ersetzung in "%%i"
Bei der Suche wird Groß-/Kleinschreibung nicht unterschieden. Falls der Suchbegriff nicht gefunden wurde, erfolgt eine Fehlermeldung.
Grüße
bastla
Hallo mmenzel!
Wenn Du in Zeile 2 einen (Test-)Ordner, welcher tatsächlich Dateien vom Typ ".ghtml" enthält, angibst, sollte eine Ersetzung vorgenommen werden - Unterordner werden in der obigen Fassung noch nicht berücksichtigt
Kannst Du bitte eine Datei (bzw deren relevante Zeilen) vor und nach der Ersetzung posten? So ganz klar ist mir noch nicht, was nun in die neue Zeile soll.
Grüße
bastla
Wenn Du in Zeile 2 einen (Test-)Ordner, welcher tatsächlich Dateien vom Typ ".ghtml" enthält, angibst, sollte eine Ersetzung vorgenommen werden - Unterordner werden in der obigen Fassung noch nicht berücksichtigt
Kannst Du bitte eine Datei (bzw deren relevante Zeilen) vor und nach der Ersetzung posten? So ganz klar ist mir noch nicht, was nun in die neue Zeile soll.
Grüße
bastla
Hallo mmenzel!
Das könnte dann so aussehen:
Als Attributwert wird alles nach dem Attributnamen (%Suchbegriff%) bis zum Zeilenende verwendet.
Nochmals der Hinweis: Bitte zunächst Testdaten verwenden, da die Dateien unmittelbar verändert werden!
Grüße
bastla
Das könnte dann so aussehen:
@echo off & setlocal
set "Ordner=D:\Test"
set "Dateien=*.ghtml"
set "Suchbegriff=Message-ID: "
set "Zusatzzeile=x-ID: "
if "%Ordner:~-1%"=="\" set "Ordner=%Ordner:~,-1%"
set "IL=%temp%\InsertLine.vbs"
echo Set args = WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject")>%IL%
echo T=fso.OpenTextFile(args(0)).ReadAll:P=InStr(1,T,args(1),vbTextCompare):If P=0 Then WScript.Quit 1 >>%IL%
echo P=P+Len(args(1)):P2=InStr(P,T,vbCrLF):If P2^<^>0 Then fso.CreateTextFile(args(0)).Write Left(T,P2-1)^&vbCrLF^&args(2)^&Mid(T,P,P2-P)^&Mid(T,P2) Else WScript.Quit 1 >>%IL%
for /d %%a in ("%Ordner%\*.*") do call :ProcessFolder "%%a"
goto :eof
:ProcessFolder
for /r %1 %%i in (%Dateien%) do cscript //nologo %IL% "%%i" "%Suchbegriff%" "%Zusatzzeile%" || echo Keine Ersetzung in "%%i"
goto :eof
Nochmals der Hinweis: Bitte zunächst Testdaten verwenden, da die Dateien unmittelbar verändert werden!
Grüße
bastla
Hallo mmenzel!
Vielleicht liest sich's so etwas leichter:
Zu den Zutaten: Da Stringbearbeitung in Batch vergleichsweise mühsam ist, verwende ich für den Ersetzungs-Part VBScript. Das Erzeugen des Scripts aus dem Batch heraus erleichtert das Handling (es wird so nur eine Datei benötigt).
Für das "Drumherum" ist Batch dann wieder die einfachere Möglichkeit (und daher, wenn Dir "for" geläufig ist - ansonsten "for /?" - hoffentlich auch nicht so schwer nachvollziehbar) .
@Biber

Grüße
bastla
Vielleicht liest sich's so etwas leichter:
@echo off & setlocal
set "Ordner=D:\Test"
set "Dateien=*.ghtml"
set "Suchbegriff=Message-ID: "
set "Zusatzzeile1=x-ID: "
set "Zusatzzeile2=durch-set-festzulegender-begriff_1: durch-set-festzulegender-begriff_2"
if "%Ordner:~-1%"=="\" set "Ordner=%Ordner:~,-1%"
set "IL=%temp%\InsertLine.vbs"
>%IL% echo Set args=WScript.Arguments
>>%IL% echo Set fso=CreateObject("Scripting.FileSystemObject")
>>%IL% echo T = fso.OpenTextFile(args(0)).ReadAll
>>%IL% echo P = InStr(1, T, args(1),vbTextCompare)
>>%IL% echo If P = 0 Then WScript.Quit 1
>>%IL% echo P = P + Len(args(1))
>>%IL% echo P2 = InStr(P, T, vbCrLF)
>>%IL% echo If P2^<^>0 Then
>>%IL% echo fso.CreateTextFile(args(0)).Write _
>>%IL% echo Left(T, P2 - 1) ^& vbCrLF _
>>%IL% echo ^& args(2) _
>>%IL% echo ^& Mid(T, P, P2-P) ^& vbCrLF _
>>%IL% echo ^& args(3) _
>>%IL% echo ^& Mid(T, P2)
>>%IL% echo Else
>>%IL% echo WScript.Quit 2
>>%IL% echo End If
for /d %%a in ("%Ordner%\*.*") do call :ProcessFolder "%%a"
goto :eof
:ProcessFolder
for /r %1 %%i in (%Dateien%) do (
cscript //nologo %IL% "%%i" "%Suchbegriff%" "%Zusatzzeile1%" "%Zusatzzeile2%"
if errorlevel 1 echo Keine Ersetzung in "%%i"
)
goto :eof
Für das "Drumherum" ist Batch dann wieder die einfachere Möglichkeit (und daher, wenn Dir "for" geläufig ist - ansonsten "for /?" - hoffentlich auch nicht so schwer nachvollziehbar) .
@Biber
Grüße
bastla