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

mit Batchdatei Zeile in Textdatei finden überspringen und ersetzen

Frage Entwicklung Batch & Shell

Mitglied: OliverNeu

OliverNeu (Level 1) - Jetzt verbinden

01.10.2009 um 17:42 Uhr, 8840 Aufrufe, 15 Kommentare

Hallo liebe Gemeinde,

ich weiß zu dem Thema wurde schon einiges verfasst ich habe aber nichts wirklich passendes gefunden. Da ich absoluter Anfänger auf diesem Gebiet bin hoffe ich auf eure Hilfe. Eigentlich würde ich das Problem mit einem kleinen Fortran Programm lösen hier besteht allerdings der Zwang eine Batchdatei zu benutzen.

Meine Problemstellung ist folgende:

Über eine Batchdatei möchte ich eine Textdatei (besteht aus Zeilen mit maximal 80 Zeichen / Zeile) einlesen und gleichzeitig in eine neue Datei rausschreiben. Wenn im Text ein vordefinierter 80 Zeichen langer String gefunden wird soll nach einer definierten Anzahl von Zeilen eine Zeile durch eine andere ersetzt werden.


Ich würde mich freuen wenn ihr mir hier Tipps geben könntet.


Viele Grüße

Oliver
Mitglied: TsukiSan
01.10.2009 um 17:48 Uhr
Hi Oliverneu,

schau doch mal ganz unten nach! Da findest du viele Beispiele, wie du dein Problem mit batchen lösen kannst.

Gruß
Tsuki
Bitte warten ..
Mitglied: 60730
01.10.2009 um 18:26 Uhr
servus,

auch wenn es bestimmt schon Beispiele gibt - ein kleiner Tipp.

01.
rem Testumgebung schaffen 
02.
if not exist c:\bsp md c:\bsp 
03.
for /L %%a in (1,1,9) do echo %%a >>C:\bsp\123.ini 
04.
 
05.
rem das was du wolltest... 
06.
 
07.
for /F %%i in (C:\bsp\123.ini) do (if not %%i==7 ( 
08.
		echo %%i>>C:\bsp\ini.ini 
09.
 ) else ( 
10.
		echo ja >>C:\bsp\ini.ini && exit 
11.
))

jetzt schaust du dir das mal an, schreibst das irgendwo hin und läßt es laufen.


Gruß

edit
Auf Wunsch unseres Bastlas war ich etwas großzügiger bei der vergabe des Zeichens >
Dem Biber mag ich auch nicht widersprechen, allerdings sind die onleiner eher was für hardliner wie Ihn

*flitz*
Bitte warten ..
Mitglied: bastla
01.10.2009 um 21:08 Uhr
Hallo OliverNeu und willkommen im Forum!

Auch von mir noch ein Anhaltspunkt: Mit
01.
set Zeile= 
02.
for /f "tokens=1* delims=:" %%i in ('findstr /n /c:"vordefinierter 80 Zeichen langer String" "Textdatei"') do set "Zeile=%%i" 
03.
if not defined Zeile echo "vordefinierter 80 Zeichen langer String" nicht gefunden & goto :eof 
04.
::Datei wird verarbeitet
lässt sich vorweg prüfen, ob der gesuchte String enthalten ist und sich auch dessen Zeilennummer ermitteln.

Grüße
bastla

P.S.: @TimoBeil: Zeile 3 könnte noch ein ">" mehr vertragen ...
Bitte warten ..
Mitglied: Biber
01.10.2009 um 21:14 Uhr
P.S.: @TimoBeil: Zeile 3 könnte noch ein ">" mehr vertragen ...
...also ich mag Oneliner...auch als .ini-Dateien..
Bitte warten ..
Mitglied: OliverNeu
02.10.2009 um 07:49 Uhr
Erstmal Danke für die schnelle Hilfe!!!!!

Um mein Problem näher zu verdeutlichen. Ich habe eine Textdatei mit sehr vielen Einträgen. Folgend ein Auszug ( + = Leerzeichen):


*PART
$ HEADING
punch
$ ++1PID++2SECID++3MID++4EOSID++5HGID++6GRAV+7ADPORT+++8TMID
44400
*PART
$ HEADING
blank
$ ++1PID++2SECID++3MID++4EOSID++5HGID++6GRAV+7ADPORT+++8TMID
55500

Ich weiß nicht ob im Batch auch eine verschachtelte if-Anweisung geht denn es müssen drei aufeinanderfolgende Zeilen passen (in dem Fall *PART / $HEADING / blank). Mein Ziel ist es an die Zeile:
55500
folgendes dranzuhängen:
1
so dass folgendes entsteht:
555001
Ich weiß aber nur das die zu editierende Zeile eine Zeile nach *PART / $HEADING / blank folgt.

Weiterhin habe ich das Problem das Freizeichen nicht beachtet werden (es werden nur die ersten zusammenhängenden Zeichen rausgeschrieben.



Viele Grüße

Oliver
Bitte warten ..
Mitglied: bastla
02.10.2009 um 19:41 Uhr
Hallo OliverNeu!

Etwas zum Testen:
01.
@echo off & setlocal 
02.
set "File=D:\IniFile.ini" 
03.
set "Bak=%File%.bak" 
04.
set "Crit1=*PART" 
05.
set "Crit2=$ HEADING" 
06.
set "Crit3=blank" 
07.
set /a NoOfCriteria=3 
08.
set /a LineToChange=5 
09.
set "Append=+++++++++++++++1" 
10.
 
11.
set /a Found=0 
12.
move "%File%" "%Bak%" 
13.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Bak%"') do set "Line=%%j" & call :ProcessLine 
14.
::del "%Bak%" 
15.
goto :eof 
16.
 
17.
:ProcessLine 
18.
if %Found% geq %NoOfCriteria% goto :Count 
19.
set /a NoC=%Found%+1 
20.
call set "C=%%Crit%NoC%%%" 
21.
if "%Line%"=="%C%" (set /a Found=%NoC%) else (set /a Found=0) 
22.
goto :WriteLine 
23.
:Count 
24.
set /a Found+=1 
25.
if %Found%==%LineToChange% ( 
26.
    set "Line=%Line%%Append%" 
27.
    set /a Found=0 
28.
29.
:WriteLine 
30.
>>"%File%" echo\%Line% 
31.
goto :eof
Die ursprüngliche Datei bleibt mit dem Zusatz ".bak" als Sicherung erhalten - wenn Du das nicht möchtest, die beiden ":" am Beginn der Zeile 14 entfernen.

Da ich nicht genau wusste, wie "blank" zu verstehen ist, musst Du die Zeile 6 diesbezüglich selbst anpassen.

Grüße
bastla
Bitte warten ..
Mitglied: Biber
06.10.2009 um 22:03 Uhr
Moin OliverNeu,

da du ja nun schon seit einer Woche am Testen bist mal die Nachfrage:
  • Wo klemmt es denn?
  • Können wir irgendwie irgendwo unterstützen?
  • Oder sollen wir deinen Nick von "OliverNeu" in "OliverSchonVielRuhiger" ändern lassen?
  • Oder funktioniert jetzt alles?

Gib doch mal Feedback bitte.

Danke
Biber
Bitte warten ..
Mitglied: OliverNeu
07.10.2009 um 08:25 Uhr
Vielen Vielen Dank erstmal für die Unterstützung!!!!!

Ich hatte noch keine Zeit zu testen. Werde dies aber spätestens morgen tun, und geb dann sofort ein Feedback.

OliverSchonVielRuhiger
Bitte warten ..
Mitglied: OliverNeu
08.10.2009 um 14:20 Uhr
Entschuldige bitte die späte Antwort.

Bis auf einen Punkt funktioniert es super.

Die zu ändernde Zeile sieht folgendermaßen aus:
55500

Allerdings ist jede Zeile 80 Zeichen lang (keine Einträge werden mit Leerzeichen
aufgefüllt).

=> Ist es möglich die Zeichenkette bei einer definierten Anzahl (z.B. 60) abzuschneiden
und dann den neuen String dranhängen?

=> Oder besser / allgemeiner ist es möglich die Zeile von - bis zu editieren (z.B. von 61 - 70)?


Danke für die Hilfe

Oliver
Bitte warten ..
Mitglied: bastla
08.10.2009 um 16:50 Uhr
Hallo OliverNeu!
=> Ist es möglich die Zeichenkette bei einer definierten Anzahl (z.B. 60) abzuschneiden und dann den neuen String dranhängen?
Mit CMD können Teilstrings gebildet werden - um also die ersten 60 Zeichen der betreffenden Zeile zu verwenden und daran den in der Variablen %Append% gespeicherten String anzufügen, müsste die Zeile 26 so aussehen:
set "Line=%Line:~0,60%%Append%"
wobei %Line:~0,60% bedeutet: Überspringe vom Anfang weg 0 Zeichen (= beginne ganz am Anfang) und verwende dann die nächsten 60 Zeichen.

Analog kannst Du andere Teilstrings bilden, wobei sogar (durch negatives Vorzeichen) vom Ende des Strings gezählt werden kann - Beispiel:
echo %date:~-4%
Hier werden vom Inhalt der Variablen %date% ab dem 4. Zeichen von rechts alle (daher ist keine zusätzliche Längenangabe erforderlich) Zeichen verwendet - ergibt hier das aktuelle Jahr (wenn das Datum das Jahr vierstellig angezeigt wird). Nachzulesen ist das Ganze in der Onlinehilfe (zB set /?).
=> Oder besser / allgemeiner ist es möglich die Zeile von - bis zu editieren (z.B. von 61 - 70)?
Um die Zeichen 61 bis 70 auszutauschen (durch den Inhalt der Variablen %Append% zu ersetzen) musst Du zwei Teile der ursprünglichen Zeile verwenden: Die ersten 60 Zeichen und alles nach dem 70. Zeichen - demzufolge:
set "Line=%Line:~0,60%%Append%%Line:~70"
Du musst natürlich dafür sorgen, dass %Append% tatsächlich genau 10 Zeichen enthält.

Grüße
bastla
Bitte warten ..
Mitglied: OliverNeu
09.10.2009 um 08:24 Uhr
Hallo bastla,

super jetzt funktioniert es genau so wie ich es brauche. Ich bin echt begeistert was mit Batch
alles geht.

Gruß

Oliver
Bitte warten ..
Mitglied: OliverNeu
09.10.2009 um 08:26 Uhr
An alle,

vielen Dank für eure schnelle und kompetente Unterstützung. Hier habt mir
wirklich sehr geholfen. Das Skript funktioniert wirklich super und ist eine
große Hilfe.


Gruß

Oliver
Bitte warten ..
Mitglied: OliverNeu
09.10.2009 um 09:10 Uhr
Hallo Bastla,

nur noch eins bitte. Ist es möglich das "von" und "bis" variabel zu machen?
Ich hätte gedacht das es so funktionieren sollte:

set /a von=61
set /a bis=70

set "Line=%Line:~0,%von%-1%%Append%%Line:~%bis%%"

Tut es aber nicht. Warum?


Gruß

Oliver
Bitte warten ..
Mitglied: Biber
09.10.2009 um 09:43 Uhr
Moin OliverNeu,

wenn Du, wie in deinem Anwendungsfall, im Batch "Variablen in Variablen" benötigst (oder benötigen willst), dann muss naturgemäß ein Teil dieser Variablen zuerst, ein anderer "danach", also verzögert (neudeutsch: delayed) aufgelöst werden.

Dieses teilst Du dem CMD-Interpreter durch die Direktive SetLocal EnableDelayedExpansion mit und kannst dann die Feinsteuerung, welcher Variablenteil sofort und welcher verzögert aufgelöst werden soll durch diese Schreibweise angeben:
Variable %var% in der Schreibweise %var%: Wird sofort aufgelöst
Variable %var% in der Schreibweise !var! : Wird verzögert aufgelöst.

Zu abstrakt? Dann als Beispiel am CMD-Prompt (das erste Zeichen ">" nicht mit eingeben; ist mein Prompt)
01.
>Set "line=super jetzt funktioniert es genau so wie ich es brauche. Ich bin echt begeistert was mit Batch" 
02.
>set /a "von=61,bis=70" & set "toAppend=##########" 
03.
(= 9:39:45  D:\temp=) 
04.
>echo !line:~%von%,-1!%toAppend%!line:~%bis%! 
05.
bin echt begeistert was mit Batc##########begeistert was mit Batch
Anmerkung. Bei meinem Rechner ist "Setlocal EnableDelayedExpansion" immer per Registry aktiviert.
In deinem Batchschnipsel sollten diese zwei Worte eingetragen werden.

Grüße
Biber
Bitte warten ..
Mitglied: OliverNeu
09.10.2009 um 10:48 Uhr
Hi Biber,

funktioniert super!
Danke!!!!!


Gruß

Oliver
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch-Skript: Messdaten in Textdatei finden und in eine neue Datei schreiben (5)

Frage von habmalnefrage zum Thema Batch & Shell ...

Batch & Shell
gelöst Poweshell Script soll String ersetzen und die leere Zeile löschen (4)

Frage von Mars123 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...