findstr bestimmte Zeile auslesen
hallo
ich möchte aus mehreren scriptdateien ein Wort auslesen und zwar in der 6 Zeile und das Wort steht immer zwischen anführungszeichen also so "wort" und möchte dieses gerne
über einen Batch machen mit findstr habe aber keine ahung wie.
hoffe ihr könnt mir helfen.
mfg corpse2001
ich möchte aus mehreren scriptdateien ein Wort auslesen und zwar in der 6 Zeile und das Wort steht immer zwischen anführungszeichen also so "wort" und möchte dieses gerne
über einen Batch machen mit findstr habe aber keine ahung wie.
hoffe ihr könnt mir helfen.
mfg corpse2001
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 45938
Url: https://administrator.de/contentid/45938
Ausgedruckt am: 08.11.2024 um 02:11 Uhr
8 Kommentare
Neuester Kommentar
Moin corpse,
ich hatte es so verstanden, dass das gesuchte "wort" in Anführungszeichen unbekannt ist.
Dann wäre folgende Skizze ein Anfang:
Die Text-Datei knorpsel.txt
Die Batchdatei "corpse2.bat" dazu (mit einem Parameter Name-der-Textdatei):
Das Ergebnis:
Was mich rein menschlich interessieren würde:
Wie kommt ihr auf solche abstrusen Anforderungsphantasien wie "mit Batch und findstr ein Wort in Anführungszeichen aus der 6. Zeile einer Datei rausflöhen", wenn ihr gar nicht wisst, ob Batch oder FindStr überhaupt für so etwas auch nur im Ansatz geeignet sind???
Biber,
der manchmal froh ist, gar nicht alle Ab- und Hintergründe so genau zu kennen
ich hatte es so verstanden, dass das gesuchte "wort" in Anführungszeichen unbekannt ist.
Dann wäre folgende Skizze ein Anfang:
Die Text-Datei knorpsel.txt
[zitat]
ich möchte aus mehreren scriptdateien
ein Wort auslesen
und zwar in der 6 Zeile
und das Wort steht immer zwischen anführungszeichen
also so "wort" und möchte dieses gerne über einen Batch machen
mit findstr habe aber keine ahung wie.
hoffe ihr könnt mir helfen.
Die Batchdatei "corpse2.bat" dazu (mit einem Parameter Name-der-Textdatei):
@echo off & setlocal enableDelayedExpansion
for /f "delims=" %%i in ('findstr /n . "%~1"^|findstr "^6:"') do @set ln6=%%i & Call:s !ln6:*"="! & Goto :eof
:s
@echo %~1
>corpse2 knorpsel.txt
wort
Was mich rein menschlich interessieren würde:
Wie kommt ihr auf solche abstrusen Anforderungsphantasien wie "mit Batch und findstr ein Wort in Anführungszeichen aus der 6. Zeile einer Datei rausflöhen", wenn ihr gar nicht wisst, ob Batch oder FindStr überhaupt für so etwas auch nur im Ansatz geeignet sind???
Biber,
der manchmal froh ist, gar nicht alle Ab- und Hintergründe so genau zu kennen
Moin corpse2001,
im Erklären bin ich leider nicht so gut, aber ich versuche es mal.
Sind ja gottseidank nicht so viele Zeilen.
Zeile [1] Interessanter als das "@echo off" ist das "Setlocal EnableDelayedExpansion"
"Setlocal"== alle Variablen, die ich neu anlege, existieren auch nur solange der Batch rennt.
"EnableDelayedExpansion" erlaubt die "verzögerte Variablenauflösung" oder, weniger schwülstiger ausgedrückt, dass ich in einer Batchzeile einer Variable einen neuen Wert zuweise und sofort damit weiter"rechnen" kann.
Normalerweise wäre der "neue" Variablenwert erst in der nächsten Zeile, beim nächsten Befehl verwendbar.
Wenn ich solche frisch zugewiesenen Variablen ansprechen will, muss ich die Variablen mit der Syntax !var! statt %var% ansprechen.
Zeile [2] FOR /F-Anweisungen immer von INNEN nach AUSSEN lesen.
INNEN ist die Klammer ...('findstr /n . "%~1"^|findstr "^6:"').
Zuerst ein findstr /n . "%~1". Übersetzt in etwa: Erzeuge eine Liste aller Zeilen der Datei "%1" mit Zeilennummern vorweg.
Dieses Ergebnis weiterreichen an findstr "^6:". Übersetzt: Suche mir daraus alle Zeilen, die mit "6:" beginnen.
Is' nur eine. Die Zeile 6 halt.
AUSSEN: Diese eine Zeile 6 wirs as is in die Variable %ln6% geschrieben (set ln6=%%i). "ln6" steht natürlich nur für neudeutsch "zeile6".
Danach rufe ich einen Sub-Block ":s" auf (Call:s), gebe dem als Parameter noch die nachbehandelte neue Variable %ln6% mit, in der ich alles VOR dem ersten Anführungszeichen durch "Nichts" ersetze.
Und schon bin ich feddich mit der Zeile und sage entsprechend goto :eof (In etwa: "Reicht für heute").
Zeile [3] Die Einsprungadresse meines geCALLeden Sub-Blocks
Zeile [4] Mach mir dat Echo mit dem ersten Parameter, der wo reinkommt. Mit ohne Anführungszeichen.
That's all.
Deine neue Anforderung erfordert noch eine kleine FOR /F-Anweisung aussen herum, mehr nicht. Ungetestet:
So oder so ähnlich müsste es aussehen.
Wenn Deine Ausgangsfrage beantwortet ist, dann setz bitte so ein grünes Häkchen.
Gruß
Biber
im Erklären bin ich leider nicht so gut, aber ich versuche es mal.
Sind ja gottseidank nicht so viele Zeilen.
[1]@echo off & setlocal enableDelayedExpansion
[2]for /f "delims=" %%i in ('findstr /n . "%~1"^|findstr "^6:"') do @set ln6=%%i & Call:s !ln6:*"="! & Goto :eof
[3]:s
[4]@echo %~1
Zeile [1] Interessanter als das "@echo off" ist das "Setlocal EnableDelayedExpansion"
"Setlocal"== alle Variablen, die ich neu anlege, existieren auch nur solange der Batch rennt.
"EnableDelayedExpansion" erlaubt die "verzögerte Variablenauflösung" oder, weniger schwülstiger ausgedrückt, dass ich in einer Batchzeile einer Variable einen neuen Wert zuweise und sofort damit weiter"rechnen" kann.
Normalerweise wäre der "neue" Variablenwert erst in der nächsten Zeile, beim nächsten Befehl verwendbar.
Wenn ich solche frisch zugewiesenen Variablen ansprechen will, muss ich die Variablen mit der Syntax !var! statt %var% ansprechen.
Zeile [2] FOR /F-Anweisungen immer von INNEN nach AUSSEN lesen.
INNEN ist die Klammer ...('findstr /n . "%~1"^|findstr "^6:"').
Zuerst ein findstr /n . "%~1". Übersetzt in etwa: Erzeuge eine Liste aller Zeilen der Datei "%1" mit Zeilennummern vorweg.
Dieses Ergebnis weiterreichen an findstr "^6:". Übersetzt: Suche mir daraus alle Zeilen, die mit "6:" beginnen.
Is' nur eine. Die Zeile 6 halt.
AUSSEN: Diese eine Zeile 6 wirs as is in die Variable %ln6% geschrieben (set ln6=%%i). "ln6" steht natürlich nur für neudeutsch "zeile6".
Danach rufe ich einen Sub-Block ":s" auf (Call:s), gebe dem als Parameter noch die nachbehandelte neue Variable %ln6% mit, in der ich alles VOR dem ersten Anführungszeichen durch "Nichts" ersetze.
Und schon bin ich feddich mit der Zeile und sage entsprechend goto :eof (In etwa: "Reicht für heute").
Zeile [3] Die Einsprungadresse meines geCALLeden Sub-Blocks
Zeile [4] Mach mir dat Echo mit dem ersten Parameter, der wo reinkommt. Mit ohne Anführungszeichen.
That's all.
Deine neue Anforderung erfordert noch eine kleine FOR /F-Anweisung aussen herum, mehr nicht. Ungetestet:
setlocal enableDelayedExpansion
set liste=U:\Lancom\scriptnamen.txt
FOR /f "delims=" %%x in (%liste%) do (
for /f "delims=" %%i in ('findstr /n . "%%~x"^|findstr "^6:"') do @set ln6=%%i & Call:s !ln6:*"="!
)
Goto :eof
:s
@echo %~1 >>Routernamen.txt
So oder so ähnlich müsste es aussehen.
Wenn Deine Ausgangsfrage beantwortet ist, dann setz bitte so ein grünes Häkchen.
Gruß
Biber
das funktioniert wunderbar
Freut mich. Dann geh auch bitte auf Deine Eröffnungsfrage, wähle "Editieren" und setze den Beitrag auf "gelöst".Auf "gelöst" setzen sollte schon der Fragesteller, wenn das Problem gegessen ist.
Umgekehrt ist es mir ich als Mod in diesem Bereich unlieb, Beiträge mit einem grünem Haken zu versehen, wenn ich mich selbst an der Lösungssuche beteiligt habe.
Danke
Biber