Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 6070 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 ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Datenbanken
Mit sql eine Zeile einfügen, select und feste Werte (9)

Frage von helmuthelmut2000 zum Thema Datenbanken ...

Batch & Shell
Text in neue 1. Zeile in Textdatei einfügen (4)

Frage von FuxxLi zum Thema Batch & Shell ...

Microsoft Office
gelöst Wie kann man die Standard-Schriftart bei einfügen von Text in Word 2013 festlegen? (3)

Frage von Rene1976 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...