cynix01
Goto Top

Per echo Command eine bestimmte zeile überschreiben ?

Hallo ich komme leider nicht weiter auch nicht durch googlen deshalb wend ich mich an dieses Forum hier, würde mich freuen wenn mir jemand helfen kann.

Hallo erst mal an alle. Ich suche nach eine Lösung wie ich in einer Datei die bereits vorhanden ist mit mehreren text zeilen, nur eine bestimmte zeile zu löschen und aktualiesieren also anfangs sieht sie z.B. die datei "test.txt" wie gefolgt aus:

text-zeile 1
text-zeile 2
text-zeile 3
text-zeile n
.
.
.usw....

so nun will ich n'te zeile oder z.B. als absoluter wert zeile 3 ("Beispielsweise") mit einem anderen text überschreiben(aber eben nur diese zeile die anderen sollen davon nicht betroffen sein) irgendwie per echo text>>c:\test.txt, so erstellt man aber eben nur eine neue zeile, wie kann man dass anpassen, brauch man dafür ein ganzes script ? Und wenn ja wie realisier ich dass ?

Würde mich über antworten freuen.

mfg Cynix01

Content-Key: 114915

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

Printed on: April 25, 2024 at 20:04 o'clock

Member: Biber
Biber Apr 29, 2009 at 06:24:14 (UTC)
Goto Top
Moin Cynix01,

willkommen im Forum.
Mit den Möglichkeiten der CMD.exe kannst Du -zumindest physisch- nicht in einer Textdatei editieren.
Du kannst letzten Endes entweder eine Datei lesen, eine Datei neu schreiben oder an das Ende einer vorhandenen Datei etwas anfügen.
Alle "logischen" Operationen wie Löschen, Ersetzen, Einfügen müssen entsprechend diesen Restriktionen erfolgen.

In Deinem Fall wäre also eine mögliche Strategie (wenn es denn partout mit dem Werkzeug CMD.exe erfolgen muss):
  • Lese die ursprüngliche Textdatei Alt.txt komplett Zeile für Zeile mit einer FOR/F-Anweisung
  • Vergleiche jede Zeile mit dem Suchkriterium
  • Wenn ungleich Suchwert -> schreibe die gelesene Zeile aus Alt.txt in eine neue Datei Neu.txt
  • Wenn gleich Suchwert -> schreibe eine neue Zeile nach Deinen Vorstellungen in Datei Neu.txt
  • Wenn fertig mit dem Zeilen-Lesen: Ersetze (überschreibe) Datei Alt.txt mit Neu.txt

Beispiele dazu findest Du über die Forumssuche mit "Suchen ersetzen Batch".

Grüße
Biber
Mitglied: 77559
77559 Apr 29, 2009 at 09:10:26 (UTC)
Goto Top
Moin Biber,

hört sich wirklich nach einer Übungsaufgabe an face-wink

vielleicht noch zu ergänzen das man bei einer bestimmten Zeilennummer eben die Zeilen zählen muss, entweder
  • innerhalb Im Do-Teil der for /f Schleife (Hat den Nachteil das leere Zeilen von For /f ignoriert werden und man Subroutine/DelayedExpansion braucht) oder
  • indem man For /f eine numerierte Datei übergibt mit find /v/ /n "" <Datei.txt

Gruß
LotPings
Member: Cynix01
Cynix01 Apr 29, 2009 at 09:31:42 (UTC)
Goto Top
Hi Biber,

Danke für deine info ich werd mal in Dem thread per Suche schauen nur ich wusste ned wie ich suchen soll, also eben ich wäre nie auf den Suchbegriff "Suchen ersetzen Batch" gekommen. weil ich wusste ja ned mal wie dass Theoritisch zu realisieren wäre.
Jetzt anhand deinen Punkten weiss ich es(die grobe umsetzung).

mfg Cynix01
Member: Cynix01
Cynix01 Apr 29, 2009, updated at Oct 18, 2012 at 16:38:05 (UTC)
Goto Top
Hi Biber,

Habe nun auch mal nach anderen beiträgen gesucht, bin auf folgenden gestoßen:

Per Batch Zeile mit bestimmtem Wort löschen und nach einer bestimmten Zeile etwas einfügen. damit wäre es theoritisch realisierbar, wenn ich " n1=" (siehe beitrag) z.B. in zeile 2 ändere um in zeile 3 die ich in dem script dann auch anpasse um sie vorher temporär zu löschen um die 3. zeile dann zu ersetzen? Oder lieg ich da falsch ?


mfg Cynix01
Mitglied: 77559
77559 Apr 29, 2009, updated at Oct 18, 2012 at 16:38:05 (UTC)
Goto Top
Zitat von @Cynix01:
Habe nun auch mal nach anderen beiträgen gesucht, bin auf folgenden gestoßen:

Per Batch Zeile mit bestimmtem Wort löschen und nach einer bestimmten Zeile etwas einfügen. damit wäre es theoritisch realisierbar, wenn ich " n1=" (siehe beitrag) z.B. in zeile 2 ändere um in zeile 3 die ich in dem script dann auch anpasse um sie vorher temporär zu löschen um die 3. zeile dann zu ersetzen? Oder lieg ich da falsch ?
Ja face-sad
Das 2-teilige Beispiel ist so nicht anwendbar.

@echo off
set In=Input.txt
set Out=output.txt
set Line=3
set NewText=Neuer Text

Type Nul >%Out%
for /f "tokens=1* delims=" %%A in (  
  'find /V /N "" ^<%In%'  
) do if %%A==%Line% (
>>%Out% echo/%NewText%
) else (
>>%Out% echo/%%B
)

Zum Veranschaulichen was im Batch passiert, schau dir mal in einem Cmd Fenster die Ausgabe an von:
find /V /B "" <BeliebigeDatei.txt

Gruß
LotPings
[EDIT]Zeile 11 und 13 geändert! [/Edit]
Member: Cynix01
Cynix01 Apr 29, 2009 at 11:04:34 (UTC)
Goto Top
Hey Danke LotPings,

ich muss mich mal wohl mehr mit Batch anweisungen befreunden aber is im Prinzip ja wohl ned schwerer als irgendwelche if/else for/do while anweisungen in C/Java zu machen, nur die syntax is etwas anders, was bedeutet denn z.B. "%%" vor eine variablen ?
%Variable% dass is mir klar nur %%Variable ? Ich glaub ich leg mir maln gutes buch zu batch scripting an, könntet ihr mir ein gutes empfehlen ? Ich weiss man kann sich dass auch alles im Netz zusammenkratzen, mir ist aber ein buch in der Hand lieber, aber es sollte dann auch alles gut und ausführlich von jedem etwas behandelt werden.

mfg Cynix01
Member: Cynix01
Cynix01 Apr 29, 2009 at 12:26:16 (UTC)
Goto Top
Hab noch 1 Hürde die ich nicht meister, ich will die Batch noch per echo commands erstellen
jedoch klappt dass z.B. mit folgenden zeichen nicht so wie ich will ich shcreib mal dein script hin und mach mal comments wie z.B. in C

echo set In=Input.txt>c:\script.bat
echo set Out=output.txt>>c:\script.bat
echo set Line=3>>c:\script.bat
set NewText=Neuer Text>>script.bat
echo Type Nul >%Out%>>c:\script.bat hier schon das erste syntax problem wegen >
echo for /f "tokens=1* delims=" %%A in (>>c:\script.bat
hier soweit alles klar
echo 'find /V /N "" ^<%In%'>>c:\script.bat hier ^ dieses zeichen wird auch ein syntax fehler
echo ) do if %%A==%Line% (>>c:\script.bat
echo >>%Out% echo/%NewText% >>c:\script.bat
Syntax prob wieder wegen > bzw. >>
echo ) else (>>c:\script.bat
echo >>%Out% echo/%%B >>c:\script.bat wieder syntax wegen >>
echo ) >>c:\script.bat
start c:\script.bat
wegen all den syntax fehlern um das script file per echo zu erstellen geht hier beim starten des scriptes auch alles schief face-sad

also ich will eig. wirklich mal alles versuchen per cmd hinzukriegen ohne nen texteditor wo man das script copy paste hinschmettern kann.
Ich hoffe mal da gibt es ne Lösung das syntax technisch umzusetzen (eben nur per cmd lines ohne editor)

mfg Cynix01
Mitglied: 77559
77559 Apr 29, 2009 at 13:35:44 (UTC)
Goto Top
Zitat von @Cynix01:
was
bedeutet denn z.B. "%%" vor eine variablen ? %Variable% dass is mir klar nur %%Variable ?
Schleifenvariablen sind direkt auf der Kommandozeile mit einfachem %a, und in einer Batchdatei mit doppeltem %%a zu benutzen. siehe: For /?

Ich glaub ich leg mir maln gutes buch zu batch scripting an, könntet ihr mir ein gutes empfehlen ?
Ich weiss man kann sich dass auch alles im Netz zusammenkratzen, mir ist aber ein buch in der Hand lieber, aber es sollte dann auch alles gut und ausführlich von jedem etwas behandelt werden.

Leider gibts da nicht viele. Da ich von der ersten DOS Version (eigentlich CP/M) dabei bin, hab ich nie eins gefunden das zu meinem jeweiligen Wissensstand gepasst hätte.
Mitglied: 77559
77559 Apr 29, 2009 at 13:46:52 (UTC)
Goto Top
Der einfachste Weg, auf der Kommandozeile einen Textaus der Zwischenablage in eine Datei zu packen ist über
(Es sollten aber der QuickEdit- und Einfügemodus in den Fenstereigenschaften aktiviert sein.):

Copy con DeinBatch.cmd[Enter]
[rechte Maustaste]
[STRG-Z oder F6][Enter]

Wenn du mit echo Befehlen arbeiten willst, musst du verhindern das IO-Umleitungen Pipes etc direkt interpretiert werden, Anstatt als Befehl in die Ausgabedatei geschrieben zu werden.
Dieses Escapen kannst du mit einem Caret ^ direkt vor dem Zeichen machen (funktioniert übrigens auch mit einem Zeilenumbruch)

Gruß
LotPings
Member: torch88
torch88 Jul 28, 2009, updated at Oct 18, 2012 at 16:38:53 (UTC)
Goto Top
habe zu diesem code noch ne frage:

Zitat von @77559:
> Zitat von @Cynix01:
> Habe nun auch mal nach anderen beiträgen gesucht, bin auf
folgenden gestoßen:
>
> Per Batch Zeile mit bestimmtem Wort löschen und nach einer bestimmten Zeile etwas einfügen. damit
wäre es theoritisch realisierbar, wenn ich " n1="
(siehe beitrag) z.B. in zeile 2 ändere um in zeile 3 die ich in
dem script dann auch anpasse um sie vorher temporär zu
löschen um die 3. zeile dann zu ersetzen? Oder lieg ich da
falsch ?
Ja face-sad
Das 2-teilige Beispiel ist so nicht anwendbar.

> @echo off
> set In=Input.txt
> set Out=output.txt
> set Line=3
> set NewText=Neuer Text
> 
> Type Nul >%Out%
> for /f "tokens=1* delims=" %%A in (  
>   'find /V /N "" ^<%In%'  
> ) do if %%A==%Line% (
> >>%Out% echo/%NewText%
> ) else (
> >>%Out% echo/%%B
> )
> 

Zum Veranschaulichen was im Batch passiert, schau dir mal in einem
Cmd Fenster die Ausgabe an von:
find /V /B "" <BeliebigeDatei.txt

Gruß
LotPings
[EDIT]Zeile 11 und 13 geändert! [/Edit]


und zwar: funktioniert (fast) perfekt, ABER:

habe in der zu bearbeitenden datei [ ] als zeichen und diese werden in der zu bearbeitenden datei zwingend benötigt.

jetzt löscht mir aber das skript die gesamten [ und die ] bleiben stehen.

wofür wird also delims=" genau verwendet? setzt die beiden klammern als delims, also trennzeichen ein, oder? aber ich habe es mit zeichen versucht, die nicht in der datei vorkommen, mit dem ergebnis, dass die ausgabedatei leer ist... jemand einen lösungsvorschlag?

gruß torch
Member: bastla
bastla Jul 28, 2009 at 18:52:53 (UTC)
Goto Top
Hallo torch88!

Völlig ungetestet:
@echo off & setlocal
set In=Input.txt
set Out=output.txt
set Line=3
set NewText=Neuer Text
 
Type Nul >%Out%
for /f "tokens=1* delims=:" %%A in ('findstr /N "^" "%In%"') do if %%A==%Line% (>>%Out% echo/%NewText%) else (>>%Out% echo/%%B)  
Grüße
bastla
Member: torch88
torch88 Jul 28, 2009 at 20:51:55 (UTC)
Goto Top
Hi bastla!

Probier ich gleich aus face-smile

Gruß torch

EDIT:

Muss mich nochmals bei dir bedanken, funktioniert! face-smile

Nur aus reinem Interesse, ich versteh nämlich nicht genau, was bei dem alten Script das delims= bewirkt, ganz normal die beiden Zeichen als Trennzeichen definieren oder ist das ein spezieller Befehl?

Ebenso blick ich die ' in beiden Quelltexten nicht ganz.

Schöne Grüße, torch