pnk001
Goto Top

Suche wort in .txt und lösche alles darüber!

Hallo,

Wollte mal fragen ob sowas mittels Batch realisierbar wäre. "Suche ein Wort in einer .txt und lösche alles was darüber steht."

Bsp:

Output.txt
Auto
schnelles Mottorad 
Kaputtes Fahrrad
Auto
LKW


Output.txt nach der bearbeitung der Batch
Auto
LKW


hoffe das wäre möglich :P

MFG

Content-ID: 213609

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

Ausgedruckt am: 27.11.2024 um 00:11 Uhr

Endoro
Endoro 07.08.2013 um 13:48:27 Uhr
Goto Top
Hallo,
ja geht schon:
for /f "delims=:" %%a in ('findstr /nc:"Kaputtes Fahrrad" file') do set "line=%%a"  
<file more +%line%
lg.
bastla
bastla 07.08.2013 um 14:30:05 Uhr
Goto Top
@ Endoro
... wobei offensichtlich nicht
lösche alles was darüber steht.
sondern "behalte alles was darunter steht" steht gemeint war, womit Dein Ansatz passt (ansonsten wäre es
for /f "delims=:" %%a in ('findstr /nc:"Kaputtes Fahrrad" file') do set /a line=%%a - 1
gewesen) ...

Grüße
bastla
pnk001
pnk001 08.08.2013 aktualisiert um 16:34:59 Uhr
Goto Top
soweit so gut :P

test.txt
2
3
4
1
1
2
3

.bat
for /f "delims=:" %%a in ('findstr /nc:"1" test.txt') do set /a line=%%a - 1  
pause
<test.txt more +%line%
pause



ablauf:
J:\test>for /F "delims=:" %a in ('findstr /nc:"1" test.txt') d  
o set /a line=%a - 1

J:\test>set /a line=4 - 1

J:\test>set /a line=5 - 1

J:\test>pause
Drücken Sie eine beliebige Taste . . .

J:\test>more +4 0<test.txt
1
2
3

J:\test>pause
Drücken Sie eine beliebige Taste . . .


wie bekomme ich das nun hin das er mir die sachen aus der test.txt löscht? wäre es möglich die letzte 1. auch mit zu löschen?

mfg schonmal vielen dank
bastla
bastla 08.08.2013 aktualisiert um 18:39:57 Uhr
Goto Top
Hallo pnk001!
wie bekomme ich das nun hin das er mir die sachen aus der test.txt löscht?
Aus der "test.txt" löschen kannst Du nicht, aber die "test.txt" nur mit den gewünschten Werten neu zu erstellen ist natürlich möglich.
wäre es möglich die letzte 1. auch mit zu löschen?
Natürlich - das war ja Endoros Ansatz (ohne -1) - ich hatte mich ja nur auf Deine konkrete Formulierung bezogen, und
alles was darüber steht.
inkludiert eben nicht die gesuchte Zeile selbst.

Kombiniert sähe das dann etwa so aus:
@echo off & setlocal
set "Datei=test.txt"  
set "Suche=1"  

set "Bak=%temp%\Tmp.tmp"  
move "%Datei%" "%Bak%"  
for /f "delims=:" %%a in ('findstr /nc:"%Suche%" "%Bak%"') do set /a line=%%a  
<"%Bak%" >"%Datei%" more +%line%  
Was noch zu klären bliebe ist, ob nach kompletten Zeilen oder nach dem Vorkommen des Suchstrings am Zeilenanfang oder irgendwo in der Zeile gesucht wird - entsprechend dann die "findstr"-Schalter "/nxc:" oder "/nbc:" oder "/nc:" verwenden.

Grüße
bastla
pnk001
pnk001 08.08.2013 um 20:16:15 Uhr
Goto Top
perfekt. du hast immer eine lösung parat danke dir ;)
bastla
bastla 08.08.2013 um 20:21:08 Uhr
Goto Top
Hallo pnk001!

Freut mich, wenn's passt face-smile - aber den entscheidenden Teil hat ja Endoro beigetragen ...

Grüße
bastla
Balegor
Balegor 11.08.2013 aktualisiert um 17:40:36 Uhr
Goto Top
Hallo,
ich bin neu hier und bin kompletter neuling was .bat dateien angeht (muss mich damit im rahmen meiner ba beschäftigen) und würde mich gerne mal mit an den thread dranhängen, da es um was ähniches geht.
Ich würde gerne ab einem bestimmten string alles in der .txt löschen, hab aber nicht wircklich ne idee wie ich das was ihr hier schon gepostet hab umbauen soll
rubberman
rubberman 11.08.2013 aktualisiert um 18:35:25 Uhr
Goto Top
Hallo Balegor, willkommen im Forum.

Eigentlich solltest du schon deinen eigenen Thread aufmachen, aber naja ...

Es gibt unterschiedliche Ansätze. Hier mal, wie ich es erledigt hätte:

test.txt
Lorem ipsum dolor sit amet,
consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
sed diam voluptua.

Ich bin die letzte Zeile.
Ich werde gelöscht.

At vero eos et accusam et justo duo dolores et ea rebum.
Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet.

*.bat
@echo off &setlocal
set "file=test.txt"  
set "search=Ich bin die letzte Zeile."  

set "lastline="  
for /f "delims=:" %%i in ('findstr /nc:"%search%" "%file%"') do if not defined lastline set "lastline=%%i"  
if not defined lastline goto :eof

setlocal EnableDelayedExpansion
<"!file!" >"!temp!\text.tmp" (  
  for /l %%i in (1 1 %lastline%) do (
    set "ln=" &set /p "ln="  
    echo(!ln!
  )
)
endlocal

move "%temp%\text.tmp" "%file%"  
Dateien werden in Batch zeilenweise abgearbeitet. Ggf. musst du dein
ab einem bestimmten string
noch weiter konkretisieren.

Grüße
rubberman
Balegor
Balegor 11.08.2013 aktualisiert um 19:31:30 Uhr
Goto Top
hmm bei deinem Bsp. funktioniert die .bat ohne Probleme, bei meiner .txt schreibt sie nur viele leere Zeilen ans Ende und macht ab und zu mitten im Wort nen Zeilenumbruch.
Meine Ausgangsdatei enthält sql befehle für db2 und ich möchte die Datei so umschreiben das sie ich sie mit postgresql nutzen kann, da postgresql aber ne ganze Reihe an Befehlen nicht kennt, wollt ich den Teil der Datei einfach "abschneiden". Der String an dem "abgeschnitten" werden soll ist einfach nur: "-- bis hier her", aber vorher kommen halt auch ne menge "@" Zeichen (weis nicht ob das nen Unterschied macht)

EDIT: der besagte string sollte dann auch mit abgeschnitten werden
rubberman
rubberman 11.08.2013 um 19:33:37 Uhr
Goto Top
Hallo Balegor.

Batch verarbeitet Textdateien im ASCII Zeichensatz. Bei meinem Beispiel kommt noch hinzu dass nur Windows-Zeilenumbrüche (0x0D 0x0A) akzeptiert werden und Zeilen nur bis zum 1023. Zeichen eingelesen werden.
Wo das Problem steckt weiß ich nicht, ohne deine Datei zu kennen. In einem HEX Editor solltest du das oben genannte aber herausfinden können.

Grüße
rubberman
Balegor
Balegor 11.08.2013 aktualisiert um 19:52:12 Uhr
Goto Top
also die Zeilenumbrüche sind alle 0A (ein Punkt im HEX Editor) und die Zeilen sind nie länger als 80 Zeichen

die Datei besteht halt zum größen Teil aus create table anweisungen wie hier und irgentwann kommt halt der string:

CREATE TABLE customer (
c_custkey INTEGER NOT NULL,
c_name VARCHAR(25),
c_address VARCHAR(40),
c_nationkey INTEGER NOT NULL,
c_phone CHAR(15),
c_acctbal DECIMAL(12, 2),
c_mktsegment CHAR(10),
c_comment VARCHAR(117),

CONSTRAINT customer_pk PRIMARY KEY(C_CUSTKEY),
CONSTRAINT nation_fk FOREIGN KEY(c_nationkey)
REFERENCES nation(n_nationkey) ON DELETE RESTRICT
)@
CREATE INDEX cust_name_idx ON customer(c_name)@
.
.
.
-- bis hier her

ab da soll alles inclusive des strings abgeschnitten werden
rubberman
rubberman 11.08.2013 aktualisiert um 20:53:29 Uhr
Goto Top
Hallo Balegor.

Man könnte MORE vorher die Zeilenumbrüche "normalisieren" lassen. Eine Zeile mehr wegzuschneiden ist auch nicht das Problem ...

Teste:
@echo off &setlocal
set "file=test.txt"  
set "search=-- bis hier her"  

<"%file%" >"%temp%\text.tmp" more  

set "lastline="  
for /f "delims=:" %%i in ('findstr /nc:"%search%" "%temp%\text.tmp"') do if not defined lastline set /a "lastline=%%i-1"  
if not defined lastline goto :eof

setlocal EnableDelayedExpansion
<"!temp!\text.tmp" >"!file!" (  
  for /l %%i in (1 1 %lastline%) do (
    set "ln=" &set /p "ln="  
    echo(!ln!
  )
)
del "!temp!\text.tmp"  

Grüße
rubberman

Edit: Aufräumen vergessen face-wink
Balegor
Balegor 13.08.2013 aktualisiert um 19:19:32 Uhr
Goto Top
also ich hab jetzt bischen rumprobiert, da der 2te Vorschlag an meiner Ausgangsdatei rein gar nichhs geändert hat (weder Zeilen eingefügt wo sie nicht hinsollten, noch ab dem besagten String gelöscht). Dabei ist mir aufgefallen, das wenn ich meine .txt mit notepad++ öffne, sind die Zeilenumbrüche wie sei sein sollen (0A im hex editor), wenn ich die Datei aber mit dem windows editor öffne steht da alles hintereinander (viell ist das ja das problem) und die sinnlosen Zeilenumbrüche die die erste .bat verursacht hat, sind genau an den stellen wo die Zeile ganz hinten umspringt im windors editor. Ich hab jetzt mal manuell ein paar zeileumbrüche dort eingefügt und die sind 0D im hex editor. gibts ne möglichkeit die 0A Zeilenumbrüche automatisch zu 0D umbrücehn zu machen, da die Datei ziemlich längllich ist und das manuell zu machen wäre nicht ganz so lustig.

hat sich erledigt, hatte nen tippfehler -.- für meine anderen fragen mach ich mal nen eigenen thread auf face-smile
thx erstmal für die hilfe rubberman