novice15
Goto Top

Batch: In Text Datei zwei Punkte finden und den Text dazwischen löschen

Hallo Zusammen,

ich möchte mehrere txt Dateien durchsuchen und die Zeilen mit dem Text "PROCEDURE print" und "END OF PROCEDURE print" sowie die Zeilen dazwischen löschen.
Beispiel:

' * PROCEDURE print *
Call CUSTOBJOPEN("PRINT")
CUSTDLGTITLE=PRINT_
' * END OF PROCEDURE print **

Dieser komplette Block sollte gelöscht werden.
Momentan verwende ich folgenden Batch aus dem Forum:

:: StripDefinitions.cmd ::::::::::::::::::::::::::::::::::::::::::::
@echo off&SetLocal
Set Basis=C:\Users\fritz\Desktop\fritz
Set Defi=C:\Users\fritz\Desktop\fritz\Suche\Suchen.txt
Set Dateien=*.vbs
Pushd %Basis%
For /F "Delims=" %%A in ('Dir /B /S /A-D "%Dateien%" '
) Do findstr /L /G:%Defi% "%%A">NUL 2>&1 &&Call :Process "%%~fA"
Popd
Goto :eof
:Process -----------------------------------------------------------
Echo Bearbeite: %~1
If Exist "%~dpn1.Bak" Del /Q "%~dpn1.Bak" >NUL 2>&1
Ren %1 "%~n1.Bak"
findstr /I /V /G:%Defi% "%~dpn1.Bak" >%1
:: start "" /Wait Winmerge %1 "%~dpn1.Bak" & Pause
:: StripDefinitions.cmd ::::::::::::::::::::::::::::::::::::::::::::

Damit kann ich nur einzelne Wörter suchen und die Zeile löschen.
Hat jemand einen guten Lösungvorschlag?
Vielen Dank für eure Hilfe.

Gruß
novice

Content-ID: 290578

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

Ausgedruckt am: 26.11.2024 um 19:11 Uhr

122990
Lösung 122990 10.12.2015, aktualisiert am 11.12.2015 um 13:50:41 Uhr
Goto Top
Moin,
z.b. fix mit diesem Powershell-Schnippsel
[regex]::replace((gc 'C:\datei.txt' | out-string),'(?sim)[^\r\n]*?PROCEDURE print.*?END OF PROCEDURE print[^\r\n]*','') | set-content 'C:\datei-fertig.txt'  
oder diesem VBS
Const DATEIIN = "C:\datei.txt"  
Const DATEIOUT = "C:\datei-fertig.txt"  
Set fso = CreateObject("Scripting.FileSystemObject")  
Set regex = CreateObject("vbscript.regexp")  
regex.Global = True: regex.IgnoreCase = True: regex.MultiLine = True
regex.Pattern = "^.*PROCEDURE print[\s\S]*END OF PROCEDURE print.*"  
fso.OpenTextFile(DATEIOUT,2,True).Write(regex.Replace(fso.OpenTextFile(DATEIIN,1).ReadAll(),""))  
usw. und sofort.

Einmal die Forensuche bemüht und nach Suchen und Ersetzen gesucht und 1000 Threads gefunden ....

Gruß grexit
AnkhMorpork
AnkhMorpork 11.12.2015 aktualisiert um 09:18:08 Uhr
Goto Top
Zitat von @122990:
Einmal die Forensuche bemüht und nach Suchen und Ersetzen gesucht und 1000 Threads gefunden ....

Genau das ist ja das Problem ... face-sad
TlBERlUS
TlBERlUS 11.12.2015 um 09:20:34 Uhr
Goto Top
Zitat von @AnkhMorpork:

Zitat von @122990:
Einmal die Forensuche bemüht und nach Suchen und Ersetzen gesucht und 1000 Threads gefunden ....

Genau das ist ja das Problem ... face-sad
Was jetzt, der Prozess des Suchens oder das es schon so viele Einträge dazu gibt ?
AnkhMorpork
AnkhMorpork 11.12.2015 um 09:22:38 Uhr
Goto Top
Zitat von @TlBERlUS:

Zitat von @AnkhMorpork:

Zitat von @122990:
Einmal die Forensuche bemüht und nach Suchen und Ersetzen gesucht und 1000 Threads gefunden ....

Genau das ist ja das Problem ... face-sad
Was jetzt, der Prozess des Suchens oder das es schon so viele Einträge dazu gibt ?

Wenn du schon mal 1000 Einträge durchgewürgt hättest, erübrigt sich die Frage ... face-wink
novice15
novice15 11.12.2015 um 10:18:15 Uhr
Goto Top
Vielen Dank!!!
Über google habe ich zwar sehr viel finden können, was mich jedoch nicht zu der Lösung bringt. Ich habe wenig Erfahrung mit VBS, Batch oder Powershell und bin somit auch nicht in der Lage den Code so umzuschreiben das er das macht was ich möchte.

Ich habe versucht den Code zum laufen zu bringen, jedoch ohne erfolg.

Zitat von @122990:
> Const DATEIIN = "C:\datei.txt"  
> Const DATEIOUT = "C:\datei-fertig.txt"  
> Set fso = CreateObject("Scripting.FileSystemObject")  
> Set regex = CreateObject("vbscript.regexp")  
> regex.Global = True: regex.IgnoreCase = True: regex.MultiLine = True
> regex.Pattern = "^.*PROCEDURE print \*[\s\S]* END OF PROCEDURE print.*"  
> fso.OpenTextFile(DATEIOUT,2,True).Write(regex.Replace(fso.OpenTextFile(DATEIIN,1).ReadAll(),""))  
> 

Es wird die Datei "datei-fertig.txt" erzeugt, jedoch ist der Text der gelöscht werden soll immer noch drinn.
Wo liegt der Fehler?
122990
122990 11.12.2015 aktualisiert um 10:22:09 Uhr
Goto Top
Genau deswegen beten wir hier immer und immer wieder BITTE POSTET EUREN CODE IN CODETAGS !!
Läuft hier einwandfrei ...ansonsten sind wegen dem hier genannten Umstand das ohne Codetags gepostet wurde vermutlich Sonderzeichen abhanden gekommen ...oder deine Datei ist in Unicode dann muss man es geringfügig anpassen.

Bitte nutze also Code-Tags für deinen Quellcode: <code> Quellcode </code>.
novice15
novice15 11.12.2015 um 10:32:38 Uhr
Goto Top
I´m Sorry.....

:: StripDefinitions.cmd :::::::::::::::::::::::::::::::::::::::::::: 
@Echo off&SetLocal  
Set Basis=C:\Users\fritz\Desktop\fritz
Set Defi=C:\Users\fritz\Desktop\fritz\Suche\Suchen.txt 
Set Dateien=*.vbs 
:: Set Variablen oberhalb anpassen. 
Pushd %Basis% 
For /F "Delims=" %%A in ('Dir /B /S /A-D "%Dateien%" '   
  ) Do findstr /L /G:%Defi% "%%A">NUL 2>&1 &&Call :Process "%%~fA"   
Popd 
Goto :eof 
:Process ----------------------------------------------------------- 
Echo Bearbeite: %~1 
If Exist "%~dpn1.Bak" Del /Q "%~dpn1.Bak" >NUL 2>&1    
Ren %1 "%~n1.Bak"    
findstr /I /V /G:%Defi% "%~dpn1.Bak" >%1   
:: start "" /Wait Winmerge %1 "%~dpn1.Bak" & Pause  
:: StripDefinitions.cmd ::::::::::::::::::::::::::::::::::::::::::::
122990
122990 11.12.2015 aktualisiert um 10:36:38 Uhr
Goto Top
Nein nicht diesen Code, den Inhalt deiner Textdatei ... bitte überprüfe ebenfalls wie schon gesagt ob dieser UTF8 oder Unicode ist.
122990
122990 11.12.2015 aktualisiert um 10:46:04 Uhr
Goto Top
Hier mein Test:

Inhalt der Testdatei:
Zeile1
Zeile2
' * PROCEDURE print *  
Call CUSTOBJOPEN("PRINT")  
CUSTDLGTITLE=PRINT_
' * END OF PROCEDURE print **   
Hier gehts weiter
BlaBla
BlaBla2
Nach dem Ausführen des Skripts sieht das Ergebnis so aus
Zeile1
Zeile2
Hier gehts weiter
BlaBla
BlaBla2
Also muss es an deiner hier geposteten Formatierung liegen oder dein File ist Unicode/UTF8 wenn das der Fall ist musst du die letzte Zeile so anpassen:
fso.OpenTextFile(DATEIOUT,2,True).Write(regex.Replace(fso.OpenTextFile(DATEIIN,1,False,-1).ReadAll(),""))  
Wenn das auch nicht klappt mach aus der -1 in dieser Zeile mal eine -2.
Die Formatierung ist hier wichtig da hier mit Regular Expression gearbeitet wird, und ohne Exakte Ausgangsbasis deiner Daten kann man dir nicht vernünftig helfen.
novice15
novice15 11.12.2015 um 13:21:25 Uhr
Goto Top
Super jetzt funktioniert´s. Vielen Dank!!!

Und wie bekommt man das hin, dass alle Datein im Ordner durchsucht und geändert werden. Also eine schleife... (Hab ich in der Frage nicht eindeutig beschrieben)
122990
Lösung 122990 11.12.2015 aktualisiert um 13:50:59 Uhr
Goto Top
Zitat von @novice15:
Und wie bekommt man das hin, dass alle Datein im Ordner durchsucht und geändert werden. Also eine schleife... (Hab ich in der Frage nicht eindeutig beschrieben)
Och nö, benutz doch mal die Suche hier im Forum, das gabs schon x mal wie man mit VBS alle Dateien eines Ordners verarbeitet:
Const FOLDER = "C:\quelle"  
Const EXTENSION = "vbs"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set regex = CreateObject("vbscript.regexp")  
regex.Global = True: regex.IgnoreCase = True: regex.MultiLine = True
regex.Pattern = "^.*PROCEDURE print[\s\S]*END OF PROCEDURE print.*"  

For Each file In fso.GetFolder(FOLDER).Files
	If LCase(fso.GetExtensionName(file.Name)) = LCase(EXTENSION) Then
		Set fRead = fso.OpenTextFile(file.Path,1,False,-2)
		content = fRead.ReadAll() : fRead.Close
		fso.OpenTextFile(file.Path,2,True).Write(regex.Replace(content,""))  
	End If
Next
MsgBox "Fertig"  

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen.
novice15
novice15 11.12.2015 um 13:50:15 Uhr
Goto Top
Danke!
neumier
neumier 09.10.2019 aktualisiert um 22:32:47 Uhr
Goto Top
Vielen Dank für den Beitrag 122990 (Level 2)! Hat mir wirklich sehr geholfen!
Danke, dass du dir die Zeit genommen hast!