Mit findstr eine Zeile zurück
Guten Abend allerseits!
Habe ein denk ich mal nicht so aufwändiges Problem...
ich möchte mit findstr eine txt durchsuchen auf ein bestimmtest Muster und wenn dieses in einer Zeile gefunden wurde, die Zeile selbst und die darüber in eine neue txt kopieren.
so in der Richtung müsste es ja aussehen...
for /F "delims= tokens=1" %%a in ('findstr /I "Muster" List.txt') do echo %%a >>Neue_List.txt
Bsp-Text:
asdkuhuwqajshd
asdlkjfhjlkhfa
aösdljMusteras
ösldkjfmnsadlj
...dann würde ich in der neuen txt gerne diese Zeilen haben: "aösdljMusteras" und "asdlkjfhjlkhfa"
hoffe das war einigermaßen verständlich
mfg
lalaman
Habe ein denk ich mal nicht so aufwändiges Problem...
ich möchte mit findstr eine txt durchsuchen auf ein bestimmtest Muster und wenn dieses in einer Zeile gefunden wurde, die Zeile selbst und die darüber in eine neue txt kopieren.
so in der Richtung müsste es ja aussehen...
for /F "delims= tokens=1" %%a in ('findstr /I "Muster" List.txt') do echo %%a >>Neue_List.txt
Bsp-Text:
asdkuhuwqajshd
asdlkjfhjlkhfa
aösdljMusteras
ösldkjfmnsadlj
...dann würde ich in der neuen txt gerne diese Zeilen haben: "aösdljMusteras" und "asdlkjfhjlkhfa"
hoffe das war einigermaßen verständlich
mfg
lalaman
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 95042
Url: https://administrator.de/contentid/95042
Ausgedruckt am: 24.11.2024 um 21:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo,
ich weiß jetzt nicht, ob das für dich hilfreich ist. Aber mit der Windows Powershell (quasi der Nachfolger der DOS-Shell) ist das kein Problem.
Mit der DOS-Shell kann ich das zumindest nicht. Problem: man müsste die Datei Zeilenweise durchlaufen und sich immer die vorherige noch merken. Ich weiß nicht, wie man in DOS die Datei zeilenweise durchläuft, und findstr akzeptiert als Eingabe ja auch nur Dateien, keine Strings.
Gruß
Filipp
ich weiß jetzt nicht, ob das für dich hilfreich ist. Aber mit der Windows Powershell (quasi der Nachfolger der DOS-Shell) ist das kein Problem.
Mit der DOS-Shell kann ich das zumindest nicht. Problem: man müsste die Datei Zeilenweise durchlaufen und sich immer die vorherige noch merken. Ich weiß nicht, wie man in DOS die Datei zeilenweise durchläuft, und findstr akzeptiert als Eingabe ja auch nur Dateien, keine Strings.
Gruß
Filipp
Hallo lalaman und filippg!
Zur Not sollte es doch auch mit CMD zu machen sein (übrigens genau mit dem von filippg beschriebenen Algorithmus):
[Edit] Falls die im Beispiel angegebene Reihenfolge in der Zieldatei tatsächlich so gemeint sein sollte, müssten die Zeilen 14 und 15 getauscht werden. [/Edit]
Grüße
bastla
Zur Not sollte es doch auch mit CMD zu machen sein (übrigens genau mit dem von filippg beschriebenen Algorithmus):
@echo off & setlocal
set "Muster=Muster"
set "Quelle=D:\Liste.txt"
set "Ziel=D:\Neue_Liste.txt"
if exist "%Ziel%" del "%Ziel%"
set Vorige=
for /f "usebackq delims=" %%i in ("%Quelle%") do call :ProcessLine "%%i"
goto :eof
:ProcessLine
echo %~1|findstr /i "%Muster%">nul && (
if defined Vorige (
>>"%Ziel%" echo %Vorige%
>>"%Ziel%" echo %~1
) else (
echo Keine Zeile vor %1 gefunden!
)
)
set "Vorige=%~1"
goto :eof
Grüße
bastla
Hallo!
Grüße
bastla
Nicht funktioniert hat es z.B. bei den Zeichen " und >
Wenn Derartiges ins Spiel kommt, greife ich eigentlich tatsächlich lieber zu einer anderen Sprache (in meinem Fall VBS) - aber einen Versuch soll's wert sein:@echo off & setlocal
set "Muster=Muster"
set "Quelle=D:\Liste.txt"
set "Ziel=D:\Neue_Liste.txt"
if exist "%Ziel%" del "%Ziel%"
set Vorige=
for /f "usebackq delims=" %%i in ("%Quelle%") do set "Zeile=%%i" & call :ProcessLine
goto :eof
:ProcessLine
set "Zeile=%Zeile:>=^>%"
set "Zeile=%Zeile:<=^<%"
set "Zeile=%Zeile:"=§%"
echo "%Zeile%"|findstr /i "%Muster%">nul && (
if defined Vorige (
>>"%Ziel%" echo %Vorige:§="%
>>"%Ziel%" echo %Zeile:§="%
) else (
echo Keine passende Zeile vor %Zeile:§="% gefunden!
)
)
set "Vorige=%Zeile%"
goto :eof
bastla
Hallo lalaman!
So knapp vor dem Ziel wirst Du doch wohl nicht aufgeben wollen ...
Füge vor Zeile 14 noch ein:
und wenn Dir noch mehr von diesen ekelhaften Sonderzeichen (ich denke da vor allem an "|") begegnen sollten, kannst Du mit denen nach dem gleichen Muster verfahren.
Mit VBS ist der Aufwand ausnahmsweise etwas geringer als in Batch:
Grüße
bastla
So knapp vor dem Ziel wirst Du doch wohl nicht aufgeben wollen ...
Füge vor Zeile 14 noch ein:
set "Zeile=%Zeile:&=^&%"
Mit VBS ist der Aufwand ausnahmsweise etwas geringer als in Batch:
Quelle = "D:\Liste.txt"
Ziel = "D:\Neue_Liste.txt"
Muster = "Muster"
Set fso = CreateObject("Scripting.FileSystemObject")
Zeilen = Split(fso.OpenTextFile(Quelle).ReadAll, vbCrLF)
Set Z = fso.CreateTextFile(Ziel, True)
For i = 0 To UBound(Zeilen)
If InStr(1, Zeilen(i), Muster, vbTextCompare) > 0 Then
If i > 0 Then
Z.WriteLine Zeilen(i - 1)
Z.WriteLine Zeilen(i)
Else
WScript.Echo "Suchbegriff bereits in der ersten Zeile gefunden!"
End If
End If
Next
Z.Close
bastla
Hallo lalaman!
Wenn ich das richtig verstanden habe (und das Suchschema immer "Zeilenanfang - ganze Zahl - Leerzeichen - Suchmuster" lautet), etwa so:
Grüße
bastla
P.S.: Die Benachrichtigungsfunktion ist auch bei als "gelöst" markierten Beiträgen aktiv.
Wenn ich das richtig verstanden habe (und das Suchschema immer "Zeilenanfang - ganze Zahl - Leerzeichen - Suchmuster" lautet), etwa so:
Quelle = "D:\Liste.txt"
Ziel = "D:\Neue_Liste.txt"
Min = 4
Muster = "Männer"
Set rE = New RegExp
rE.IgnoreCase = True
rE.Pattern = "^(\d+) " & Muster
Set fso = CreateObject("Scripting.FileSystemObject")
Zeilen = Split(fso.OpenTextFile(Quelle).ReadAll, vbCrLF)
Set Z = fso.CreateTextFile(Ziel, True)
For i = 0 To UBound(Zeilen)
If rE.Test(Zeilen(i)) Then
Wert = rE.Execute(Zeilen(i))(0).SubMatches(0)
If CInt(Wert) >= Min Then
If i > 0 Then
Z.WriteLine Zeilen(i - 1)
Z.WriteLine Zeilen(i)
Else
WScript.Echo "Suchbegriff bereits in der ersten Zeile gefunden!"
End If
End If
End If
Next
Z.Close
bastla
P.S.: Die Benachrichtigungsfunktion ist auch bei als "gelöst" markierten Beiträgen aktiv.
Guten Abend @ all,
bin nach einer suche auf diesen Thread gestoßen. Mein Ziel war aber nicht wie angegeben das Muster mit der Zeile davor in eine Datei zu exportieren, sondern diese beiden Zeilen in einem neuen Dokument zu löschen. Dank bastla konnte dies auch umgesetzt werden. Hier die Variante.
Vielen Dank an bastla
Roachman
bin nach einer suche auf diesen Thread gestoßen. Mein Ziel war aber nicht wie angegeben das Muster mit der Zeile davor in eine Datei zu exportieren, sondern diese beiden Zeilen in einem neuen Dokument zu löschen. Dank bastla konnte dies auch umgesetzt werden. Hier die Variante.
@echo off & setlocal
set "Muster=Muster"
set "Quelle=D:\Liste.txt"
set "Ziel=D:\Neue_Liste.txt"
if exist "%Ziel%" del "%Ziel%"
set "Vorige="
for /f "usebackq delims=" %%i in ("%Quelle%") do call :ProcessLine "%%i"
if defined Vorige >>"%Ziel%" echo %Vorige%
goto :eof
:ProcessLine
echo %~1|findstr /i "%Muster%">nul && (
set "Vorige="
) || (
if defined Vorige >>"%Ziel%" echo %Vorige%
set "Vorige=%~1"
)
)
goto :eof
Vielen Dank an bastla
Roachman