Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Textdateien öffnen, Suchmuster finden, dahinter eine Zeile einfügen, abspeichern

Frage Entwicklung Batch & Shell

Mitglied: mmenzel

mmenzel (Level 1) - Jetzt verbinden

30.06.2008, aktualisiert 01.07.2008, 6100 Aufrufe, 12 Kommentare

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:
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
Mitglied: bastla
30.06.2008 um 23:08 Uhr
Hallo mmenzel und willkommen im Forum!

Handelt es sich bei "<MEIN-SUCHMUSTER>" um eine komplette Zeile oder nur um einen Teil einer Zeile?
Falls ersteres, würde es eigentlich genügen, die eine Zeile durch 2 Zeilen (die ursprüngliche und die zusätzliche) zu ersetzen.

Grüße
bastla
Bitte warten ..
Mitglied: mmenzel
30.06.2008 um 23:20 Uhr
Hallo bastla,
es ist nur ein Teil der Zeile, hier nochmal etwas detaillieter, die Zeile sieht in den verschiedenen Dateien immer so aus:
dieser-text-ist-immer-gleich hier_steht_in_jeder_datei_etwas_anderes
Das heißt die Suche würde immer nach "dieser-text-ist-immer-gleich" und danach müsste eine neue Zeile eingefügt werden.

Gruß
mmenzel
Bitte warten ..
Mitglied: bastla
30.06.2008 um 23:49 Uhr
Hallo mmenzel!

Dann etwa so:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Test" 
03.
set "Dateien=*.txt" 
04.
set "Suchbegriff=dieser-text-ist-immer-gleich" 
05.
set "Zusatzzeile=DIE NEUE ZEILE" 
06.
 
07.
set "IL=%temp%\InsertLine.vbs" 
08.
echo Set args = WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject")>%IL% 
09.
echo T=fso.OpenTextFile(args(0)).ReadAll:P=InStr(1,T,args(1),vbTextCompare):If P=0 Then WScript.Quit 1 >>%IL% 
10.
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% 
11.
 
12.
for %%i in ("%Ordner%\%Dateien%") do cscript //nologo %IL% "%%i" "%Suchbegriff%" "%Zusatzzeile%" || echo Keine Ersetzung in "%%i"
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
Bitte warten ..
Mitglied: bastla
30.06.2008 um 23:53 Uhr
Hallo mmenzel!

Zur Zusatzanforderung: Sollen sämtliche txt-Dateien (auch in Root / nur in Unterverzeichnissen) berücksichtigt werden?

Grüße
bastla
Bitte warten ..
Mitglied: mmenzel
01.07.2008 um 00:07 Uhr
Na aber holla, vielen, vielen Dank schonmal bis hierhin.

Die Dateien liegen nur in den Unterverzeichnissen.
Was ich noch erwähnen hätte sollen.. Die Dateien enthalten zwar Reintext, sind aber vom Typ .ghtml. Das Skript läuft leider nicht auch wenn ich "Dateien=*.ghtml" setze - Liegt wohl an dem vb-spezifischen-Code, mein Fehler .
In die neue Zeile soll übrigens folgendes:
Suchzeile ist: dieser-text-ist-immer-gleich hier_steht_in_jeder_datei_etwas_anderes
Neue Zeile darunter wird: Von-Hand-Einzugebener-Text hier_steht_in_jeder_datei_etwas_anderes8aus der Suchzeile obendrüber)

Es tut mir jetzt schon Leid, hier in meinem ersten Thread immer wieder was ranzuhängen, danke für deinen Mühen, bastla!
Bitte warten ..
Mitglied: bastla
01.07.2008 um 00:17 Uhr
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
Bitte warten ..
Mitglied: mmenzel
01.07.2008 um 00:31 Uhr
Machen wir es einfach mal ganz konkret ohne irgendwelche abstrakten Beschreibungen ;)

Vor der Berabeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF9EAD7>
texttexttexttexttext

Nach der Verarbeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF>
x-ID: <3BA88F5611E34166BC786CE75FF9>
texttexttexttexttext

Im Endeffekt steht vorne der Attributname und dahinter der Wert des Attributs selbst.
Bei der Bearbeitung soll eine neue Zeile hinzugefügt werden in welcher unter einem anderen Attributnamen der gleiche Wert wieder zu finden ist. Der Name dieses Attributs kann gerne auch oben bei de SETS gesetzt werden.

Ich hoffe, dass ich nun mal endlich deutlich gesprochen habe, dass es auch zu verstehen war ;)
Bitte warten ..
Mitglied: bastla
01.07.2008 um 11:38 Uhr
Hallo mmenzel!

Das könnte dann so aussehen:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Test" 
03.
set "Dateien=*.ghtml" 
04.
set "Suchbegriff=Message-ID: " 
05.
set "Zusatzzeile=x-ID: " 
06.
 
07.
if "%Ordner:~-1%"=="\" set "Ordner=%Ordner:~,-1%" 
08.
set "IL=%temp%\InsertLine.vbs" 
09.
echo Set args = WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject")>%IL% 
10.
echo T=fso.OpenTextFile(args(0)).ReadAll:P=InStr(1,T,args(1),vbTextCompare):If P=0 Then WScript.Quit 1 >>%IL% 
11.
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% 
12.
 
13.
for /d %%a in ("%Ordner%\*.*") do call :ProcessFolder "%%a" 
14.
goto :eof 
15.
 
16.
:ProcessFolder 
17.
for /r %1 %%i in (%Dateien%) do cscript //nologo %IL% "%%i" "%Suchbegriff%" "%Zusatzzeile%" || echo Keine Ersetzung in "%%i" 
18.
goto :eof
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
Bitte warten ..
Mitglied: mmenzel
01.07.2008 um 13:03 Uhr
Heiderdaus, das funktioniert einwandfrei! Ich würde ja gerne an dem Script noch selbst etwas ändern, aber bei diesen wilden Sprachkombinationen verstehe ich nichmal mehr Bahnhof .
Im Moment sieht das Ganze ja nu so aus:
---
Vor der Berabeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF9EAD7>
texttexttexttexttext

Nach der Verarbeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF>
x-ID: <3BA88F5611E34166BC786CE75FF9>
texttexttexttexttext
---
---
der letzte Schritt wäre nun Folgendes zu erreichen:
--
Vor der Berabeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF9EAD7>
texttexttexttexttext

Nach der Verarbeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF>
x-ID: <3BA88F5611E34166BC786CE75FF9>
durch-set-festzulegender-begriff_1: durch-set-festzulegender-begriff_2
texttexttexttexttext
--

Es soll quasi noch eine Zeile rangehängt werden die aus zwei variablen besteht, die man durch set festlegen kann.

Ich wollte dir eigentlich ein virtuelles Bier zukommen lassen, mittlerweile sollte es doch eher ein Kasten werden..

ps: Aus was bestht diees Skript nun eigentlich? cmd-commands + vb + ?
Bitte warten ..
Mitglied: Biber
01.07.2008 um 13:24 Uhr
ps: Aus was bestht diees Skript nun eigentlich? cmd-commands + vb + ?
...und einem Sahnehäubchen bastla'scher Inspiration..
Bitte warten ..
Mitglied: bastla
01.07.2008 um 13:58 Uhr
Hallo mmenzel!

Vielleicht liest sich's so etwas leichter:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Test" 
03.
set "Dateien=*.ghtml" 
04.
set "Suchbegriff=Message-ID: " 
05.
set "Zusatzzeile1=x-ID: " 
06.
set "Zusatzzeile2=durch-set-festzulegender-begriff_1: durch-set-festzulegender-begriff_2" 
07.
 
08.
if "%Ordner:~-1%"=="\" set "Ordner=%Ordner:~,-1%"  
09.
set "IL=%temp%\InsertLine.vbs" 
10.
 
11.
>%IL%  echo Set args=WScript.Arguments 
12.
>>%IL% echo Set fso=CreateObject("Scripting.FileSystemObject") 
13.
>>%IL% echo T = fso.OpenTextFile(args(0)).ReadAll 
14.
>>%IL% echo P = InStr(1, T, args(1),vbTextCompare) 
15.
>>%IL% echo If P = 0 Then WScript.Quit 1 
16.
>>%IL% echo P = P + Len(args(1)) 
17.
>>%IL% echo P2 = InStr(P, T, vbCrLF) 
18.
>>%IL% echo If P2^<^>0 Then 
19.
>>%IL% echo     fso.CreateTextFile(args(0)).Write _ 
20.
>>%IL% echo         Left(T, P2 - 1) ^& vbCrLF _ 
21.
>>%IL% echo         ^& args(2) _ 
22.
>>%IL% echo         ^& Mid(T, P, P2-P) ^& vbCrLF _ 
23.
>>%IL% echo         ^& args(3) _ 
24.
>>%IL% echo         ^& Mid(T, P2) 
25.
>>%IL% echo Else 
26.
>>%IL% echo     WScript.Quit 2 
27.
>>%IL% echo End If 
28.
 
29.
for /d %%a in ("%Ordner%\*.*") do call :ProcessFolder "%%a" 
30.
goto :eof 
31.
 
32.
:ProcessFolder 
33.
for /r %1 %%i in (%Dateien%) do ( 
34.
    cscript //nologo %IL% "%%i" "%Suchbegriff%" "%Zusatzzeile1%" "%Zusatzzeile2%" 
35.
    if errorlevel 1 echo Keine Ersetzung in "%%i" 
36.
37.
goto :eof
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
Bitte warten ..
Mitglied: mmenzel
01.07.2008 um 18:01 Uhr
Aaaah, wunderbar, bastla! Funktioniert alles bestens und genau so wie es sein sollte!
Danke noch für die kleine Erklärung. Ich hoffe, ich kann mich hier an irgendeiner Stelle hier mal halb so nützlich machen, wie du es getan hast - Dankeschön!
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Text in neue 1. Zeile in Textdatei einfügen
Frage von FuxxLiBatch & Shell4 Kommentare

Hallo, Folgender Sachverhalt. Die Warenwirtschaft wirft ein Exportfile mit einer Kopfzeile und danach den Datensätzen aus. Für die Weiterverarbeitung ...

Batch & Shell
Textdatei Zeile für Zeile auslesen
Frage von RIPUEDBatch & Shell

Hallo, ich würde gerne mit einem Batch-Skript Zeilen aus einer Textdatei einzeln und nacheinander auslesen und diese dann nach ...

JavaScript
Zeile mit JS einfügen
gelöst Frage von lord-iconJavaScript3 Kommentare

Ich bau an ein JS Script, was mir eine Zeile einfügt (klappt mitunter auch). Siehe hier: 3 Probleme habe ...

Batch & Shell
Zeile mit Sonderzeichen in txt einfügen
gelöst Frage von FaysaxBatch & Shell1 Kommentar

Hallo miteinander, ich habe folgendes Problem: Ich habe eine xml Datei in eine txt umgewandelt. Nun möchte ich am ...

Neue Wissensbeiträge
Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 42 MinutenApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 5 StundenWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 6 StundenWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 17 StundenInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Von rj11 auf rj45
Frage von jensgebkenLAN, WAN, Wireless19 Kommentare

Hallo Gemeinschaft, könnt ihr mir vielleicht bei der anfertigung eines Kabels helfen - habe ein rj 11 stecker und ...

Netzwerkmanagement
Firefox Profieles im Roaming
gelöst Frage von Hendrik2586Netzwerkmanagement17 Kommentare

Hallo liebe Leute. :) Ich hab da ein kleines Problem, welches anscheinend nicht unbekannt ist. Wir nutzen hier in ...

LAN, WAN, Wireless
Häufig Probleme beim Anmelden in WLAN
Frage von mabue88LAN, WAN, Wireless15 Kommentare

Hallo zusammen, in einem Netzwerk gibt es relativ häufig (1-2 mal pro Woche) Probleme mit der WLAN-Verbindung. Zunächst mal ...

Windows Server
Remotesteuerung der Sitzung (Kennung XX) fehlgeschlagen
gelöst Frage von Stefan91Windows Server14 Kommentare

Hallo Zusammen, seit kurzem bekomme ich oben genannte Fehlermeldung, wenn ich versuche eine Remotesitzung über den Taskmanager fernzusteuern (Rechtsklick ...