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

Mitglied: mmenzel

mmenzel (Level 1) - Jetzt verbinden

30.06.2008, aktualisiert 01.07.2008, 6107 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
Windows 10
Zero-Day-Lücke in Microsoft Edge
Information von kgborn vor 1 TagWindows 10

In Microsofts Edge-Browser klafft wohl eine nicht geschlossene (0-Day) Sicherheitslücke im Just In Time Compiler (JIT Compiler) für Javascript. ...

Sicherheit
Microsoft und Skype: Sicherheit
Information von kgborn vor 1 TagSicherheit

Die Tage gab es ja einige Berichte zur Sicherheit des Skype-Updaters. Der Updater von Skype läuft unter dem Konto ...

Datenschutz

Behörden ignorieren Sicherheitsbedenken gegenüber Windows 10

Information von Penny.Cilin vor 2 TagenDatenschutz8 Kommentare

Hallo, passend zum Thema Ablösung LIMUX in München ein interessanter Beitrag dazu: Behörden ignorieren Sicherheitsbedenken gegenüber Windows 10 Anscheinend ...

Sicherheit
Information Security Hub Munich airport
Information von brammer vor 2 TagenSicherheit

Hallo, Neues Center für Cyber Kriminalität am Münchener Flughafen brammer

Heiß diskutierte Inhalte
DSL, VDSL
Mindestgeschwindigkeiten DSL Telekom
Frage von justlukasDSL, VDSL14 Kommentare

Hallo zusammen, Seit diesem Jahr habe ich Verständnisprobleme mit dem Verhalten der Telekom. Wir haben seit einem Jahr VDSL ...

Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1011 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Humor (lol)
Was könnte man mit einem Server machen? Idee gesucht
Frage von 2SeitenHumor (lol)11 Kommentare

Hey Zusammen Ich habe einen alten HP G2 Rackserver zu Hause rumliegen. 28GB Ram, 1xAMD Prozi mit etwa 2GHz. ...

Switche und Hubs
LANCOM-Switch: Probleme (no link) mit SFP-Modulen?
Frage von THETOBSwitche und Hubs11 Kommentare

Hi zusammen, ich habe folgendes Problem: Und zwar habe ich an einem Standort drei Switche verbaut - LANCOM GS-2326P+, ...