OFF-TOPIC]Regex hilfe: suche bestimmten Teil aus einer Zeile
Moderators: Hacker, Stefan2, white
-
- Junior Member
- Posts: 21
- Joined: 2015-07-17, 06:28 UTC
OFF-TOPIC]Regex hilfe: suche bestimmten Teil aus einer Zeile
Hallo Leute,
ich arbeite gerade an einem script das mir meine Dateien umbennen soll.
In dieser Datei sind meine Dateien aufgelistet nach folgendem Muster:
Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen
usw.
Die Datei hat keine Zeilenumbruch, also die Angaben stehen "in einer Zeile"
DIe Namen (Ordner und Datei) sind alle unterschiedlich.
Ich möchte jetzt mit Regex folgendes machen:
Suche nach "Datei" ignoriere, alles bis zum 5. / (immer) und zeige mit danch den Text (Dateiname) bis "erstellt"
Ich habe ein Teilergenbis mit
(?siU)Datei .*/([^/]*).\w{5,6}".*
Ergebnis:
1-> Datei 01.1" erstellt:
2-> Datei 01.2" erstellt:
3-> Datei 01.3" erstellt:
Leider bekomme ich es nicht hin das nur der Dateiname angezeigt wird (also ohne " erstellt:)
Hat da jemand eine Idee wie ich das hinbekomme ?
Wäre toll wenn jemand helfen könnte.
cu Taurec
P.S. Bitte keine Vorschläge für andere Lösungen, da ich die Datei nicht erstelle und das script auch nicht selber ausführen darf.
ich arbeite gerade an einem script das mir meine Dateien umbennen soll.
In dieser Datei sind meine Dateien aufgelistet nach folgendem Muster:
Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen
usw.
Die Datei hat keine Zeilenumbruch, also die Angaben stehen "in einer Zeile"
DIe Namen (Ordner und Datei) sind alle unterschiedlich.
Ich möchte jetzt mit Regex folgendes machen:
Suche nach "Datei" ignoriere, alles bis zum 5. / (immer) und zeige mit danch den Text (Dateiname) bis "erstellt"
Ich habe ein Teilergenbis mit
(?siU)Datei .*/([^/]*).\w{5,6}".*
Ergebnis:
1-> Datei 01.1" erstellt:
2-> Datei 01.2" erstellt:
3-> Datei 01.3" erstellt:
Leider bekomme ich es nicht hin das nur der Dateiname angezeigt wird (also ohne " erstellt:)
Hat da jemand eine Idee wie ich das hinbekomme ?
Wäre toll wenn jemand helfen könnte.
cu Taurec
P.S. Bitte keine Vorschläge für andere Lösungen, da ich die Datei nicht erstelle und das script auch nicht selber ausführen darf.
RegEx: extrahiere Teilstring aus Zeile Textdatei
Hi T_a_u_r_e_c,
mit welchem Tool willst du den diese Textdatei bearbeiten?
Und was willst du mit dem Ergebnis machen / wie weiterverwenden?
- - -
Du willst also alles zwischen dem letzten Slash und dem schließenden Quote-Zeichen?
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen
Das geht zB so:
Suche: ^.+/(.+)".+$
Ersetze: \1 oder $1, je nach Tool.
- - -
Ergebnis:
Datei 01.1
Datei 01.2
Datei 01.3
Erklärung zu "^.+/(.+)".+$"
^ -- beginne am Stringanfang
.+ -- gierig ein-oder-mehr beliebigesZeichen
/ -- bis zu einem Schrägstrich (gierig, daher: bis zum letzten Schrägstrich)
(.+) -- gierig ein-oder-mehr beliebigesZeichen, fange in Capture-Group #1
" -- bis zu einem Anführungszeichen
.+ -- gierig ein-oder-mehr beliebigesZeichen folgen noch
$ -- bis zum Stringende
- - -
Tipp für's nächste Mal:
Du hast bereits einiges gut erklärt, aber poste bitte zusätzlich ganz klar das was du hast, und das was du willst, z.B.:
VORHER, das habe ich:
Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen
NACHHER, so soll das Ergebnis aussehen:
Datei 01.1
Datei 01.2
Datei 01.3
Danke.
mit welchem Tool willst du den diese Textdatei bearbeiten?
Und was willst du mit dem Ergebnis machen / wie weiterverwenden?
- - -
Du willst also alles zwischen dem letzten Slash und dem schließenden Quote-Zeichen?
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen
Das geht zB so:
Suche: ^.+/(.+)".+$
Ersetze: \1 oder $1, je nach Tool.
- - -
Ergebnis:
Datei 01.1
Datei 01.2
Datei 01.3
Erklärung zu "^.+/(.+)".+$"
^ -- beginne am Stringanfang
.+ -- gierig ein-oder-mehr beliebigesZeichen
/ -- bis zu einem Schrägstrich (gierig, daher: bis zum letzten Schrägstrich)
(.+) -- gierig ein-oder-mehr beliebigesZeichen, fange in Capture-Group #1
" -- bis zu einem Anführungszeichen
.+ -- gierig ein-oder-mehr beliebigesZeichen folgen noch
$ -- bis zum Stringende
- - -
Tipp für's nächste Mal:
Du hast bereits einiges gut erklärt, aber poste bitte zusätzlich ganz klar das was du hast, und das was du willst, z.B.:
VORHER, das habe ich:
Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen
NACHHER, so soll das Ergebnis aussehen:
Datei 01.1
Datei 01.2
Datei 01.3
Danke.
-
- Junior Member
- Posts: 21
- Joined: 2015-07-17, 06:28 UTC
Hi Stefan2
erst einmal vielen Dank für die schnelle Antwort uind Deiner Erklärung
Mit Deinem Tip hast Du natürlich recht.
Zu Deiner Lösung
Da vor dem Eintrag "Datei ...." schon eine Pfadangabe steht (das wußtest Du natürlich nicht) funktioniert Deine Lösung leider nicht.
Ich bekomme auch nicht die Dateinamen angezeigt sondern nur den ersten Pfad.
Mir ist bewußt dass das eigentlich nicht hierher gehört.
Ich hoffe trotzdem auf Hilfe
cu Taurec
P.S. die eingabe erfolgt über eine Konsole in der Firma, was dahinter steckt weiss ich leider nicht
erst einmal vielen Dank für die schnelle Antwort uind Deiner Erklärung
Mit Deinem Tip hast Du natürlich recht.
Zu Deiner Lösung
Da vor dem Eintrag "Datei ...." schon eine Pfadangabe steht (das wußtest Du natürlich nicht) funktioniert Deine Lösung leider nicht.
Ich bekomme auch nicht die Dateinamen angezeigt sondern nur den ersten Pfad.
Mir ist bewußt dass das eigentlich nicht hierher gehört.
Ich hoffe trotzdem auf Hilfe

cu Taurec
P.S. die eingabe erfolgt über eine Konsole in der Firma, was dahinter steckt weiss ich leider nicht
Eine Pfadangabe enthält normalerweise umge\kehrte\Schräg\striche als Trennzeichen,T_a_u_r_e_c wrote:Hi Stefan
.....
funktioniert Deine Lösung leider nicht.
---Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern ---
Da vor dem Eintrag "Datei ...." schon eine Pfadangabe steht (das wußtest Du natürlich nicht) funktioniert Deine Lösung leider nicht.
Ich bekomme auch nicht die Dateinamen angezeigt sondern nur den ersten Pfad.
keine 'normalen' Schrägstriche und würde somit nicht stören. Bei dir nicht?
Also, wie oben erwähnt:
Stefan wrote:
VORHER:
NACHHER:
-
- Junior Member
- Posts: 21
- Joined: 2015-07-17, 06:28 UTC
Hallo Stefan2
die Pfadangabe kommt von einem Netzlaufwerk.
Ich kann leider nichts an der Daten ändern.
Zu dem regex :
VORHER:
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:17
<part path="/ServerA/Data" main="/Ordner1" Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen part>
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:03
<part path="/ServerA/Data" main="/Ordner2" Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen part>
usw.
NACHHER:
Datei 01.1
Datei 01.2
Datei 01.3
Datei 01.1
Datei 01.2
Datei 01.3
usw.
Mit meiner Abfrage:
(?siU)Datei .*/([^/]*).\w{5,6}".*
habe ich es geschafft das erst ab Datei nach dem "/" gesucht wird.
leider wird das Ergebnis nicht am ersten " getrennt.
Ich erkenne den Grund nicht, hast Du eine Idee?
cu Taurec
P.S. Wundere Dich bitte nicht das es nur um den Dateinamen geht, alle anderen Werte kann ich abfragen.
die Pfadangabe kommt von einem Netzlaufwerk.
Ich kann leider nichts an der Daten ändern.
Zu dem regex :
VORHER:
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:17
<part path="/ServerA/Data" main="/Ordner1" Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen part>
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:03
<part path="/ServerA/Data" main="/Ordner2" Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen part>
usw.
NACHHER:
Datei 01.1
Datei 01.2
Datei 01.3
Datei 01.1
Datei 01.2
Datei 01.3
usw.
Mit meiner Abfrage:
(?siU)Datei .*/([^/]*).\w{5,6}".*
habe ich es geschafft das erst ab Datei nach dem "/" gesucht wird.
leider wird das Ergebnis nicht am ersten " getrennt.
Ich erkenne den Grund nicht, hast Du eine Idee?
cu Taurec
P.S. Wundere Dich bitte nicht das es nur um den Dateinamen geht, alle anderen Werte kann ich abfragen.
Ahhh, so nach und nach kommen die Details ans Licht. 'Netzwerk-Pfad' also
, dass erklärt warum 'es' nicht geht.
Aber du hast noch nicht erwähnt, mit welchem Tool du arbeitest, da gibt es einige,
siehe zB https://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines
Was soll denn >>(?siU)Datei .*/([^/]*).\w{5,6}".* << sein?
Also pflücke ich das mal auseinander:
[face=comicsansms]>>(?siU)<< == single line mode ; case insensitive ; ungreedy mode switch
>>Datei .*/<< == Literal 'Datei' ; Leerzeichen ; nichtgierig ein-oder-mehr beliebigesZeichen bis zu einem Schrägstrich
>>([^/]*)<< == nichtgierig ein-oder-mehr beliebigesZeichenWasKeinSchrägstrichIst, also auch ein Anführungszeichen ; fange in Capture-Group #1
>>.\w{5,6}"<< == ein beliebigesZeichen ; fünf-bis-sechs ZeichenAusDerGruppe[0-9A-Za-z_] ; Anführungszeichen
>>.*<< == nichtgierig ein-oder-mehr beliebigesZeichen [/face]
Passt das Suchmuster auf deinen String? Das verstehe ich noch nicht so ganz.
(Referenz: http://www.regular-expressions.info/modifiers.html)
Mal selbst nachdenken, hmmm.....
Soweit ich das jetzt herauslesen kann (und an deinen Beispielen sehe, danke),
möchtest du nur in Zeilen suchen, welche den String "Datei:" beinhalten?
Und aus diesen Zeilen alles ab dem fünften Schrägstrich bis vor das Anführungszeichen 'raushohlen'.
OK, mal sehen:
Da ich hier "greedy" Suche, matche ich einfach den letzten Schrägstrich:
RegEx Pattern: .*Datei:.+/(.+)".+
Replace: \1
Getestet mit EmEditor Boost.RegEx.
VORHER:
-----------------------------------------------------------------
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:17
<part path="/ServerA/Data" main="/Ordner1" Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen part>
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:03
<part path="/ServerA/Data" main="/Ordner2" Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen part>
-----------------------------------------------------------------
NACHHER:
-----------------------------------------------------------------
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:17
Datei 01.1
Datei 01.2
Datei 01.3
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:03
Datei 01.1
Datei 01.2
Datei 01.3
-----------------------------------------------------------------
EDIT: pflüge > pflücke

Aber du hast noch nicht erwähnt, mit welchem Tool du arbeitest, da gibt es einige,
siehe zB https://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines
Was soll denn >>(?siU)Datei .*/([^/]*).\w{5,6}".* << sein?
Also pflücke ich das mal auseinander:
[face=comicsansms]>>(?siU)<< == single line mode ; case insensitive ; ungreedy mode switch
>>Datei .*/<< == Literal 'Datei' ; Leerzeichen ; nichtgierig ein-oder-mehr beliebigesZeichen bis zu einem Schrägstrich
>>([^/]*)<< == nichtgierig ein-oder-mehr beliebigesZeichenWasKeinSchrägstrichIst, also auch ein Anführungszeichen ; fange in Capture-Group #1
>>.\w{5,6}"<< == ein beliebigesZeichen ; fünf-bis-sechs ZeichenAusDerGruppe[0-9A-Za-z_] ; Anführungszeichen
>>.*<< == nichtgierig ein-oder-mehr beliebigesZeichen [/face]
Passt das Suchmuster auf deinen String? Das verstehe ich noch nicht so ganz.
(Referenz: http://www.regular-expressions.info/modifiers.html)
Mal selbst nachdenken, hmmm.....
Soweit ich das jetzt herauslesen kann (und an deinen Beispielen sehe, danke),
möchtest du nur in Zeilen suchen, welche den String "Datei:" beinhalten?
Und aus diesen Zeilen alles ab dem fünften Schrägstrich bis vor das Anführungszeichen 'raushohlen'.
OK, mal sehen:
Da ich hier "greedy" Suche, matche ich einfach den letzten Schrägstrich:
RegEx Pattern: .*Datei:.+/(.+)".+
Replace: \1
Getestet mit EmEditor Boost.RegEx.
VORHER:
-----------------------------------------------------------------
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:17
<part path="/ServerA/Data" main="/Ordner1" Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen part>
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:03
<part path="/ServerA/Data" main="/Ordner2" Datei: bearbeitet= nein file="/Ordner 1.1/ Ordner 2.1/ Ordner 3.1/Ordner 4.1/Datei 01.1" erstellt: gerstern
Datei: bearbeitet= vielleicht file="/Ordner 1.2/ Ordner 2.2/ Ordner 3.2/Ordner 4.2/Datei 01.2" erstellt: heute
Datei: bearbeitet= ja file="/Ordner 1.3/ Ordner 2.3/ Ordner 3.3/Ordner 4.3/Datei 01.3" erstellt: morgen part>
-----------------------------------------------------------------
NACHHER:
-----------------------------------------------------------------
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:17
Datei 01.1
Datei 01.2
Datei 01.3
Date: 24.04.2016 execute: //ServerA filever: 0.84 scantime: 2:03
Datei 01.1
Datei 01.2
Datei 01.3
-----------------------------------------------------------------
EDIT: pflüge > pflücke

Last edited by Stefan2 on 2016-04-29, 06:36 UTC, edited 1 time in total.
-
- Junior Member
- Posts: 21
- Joined: 2015-07-17, 06:28 UTC
Hallo Stefan2
leider bin ich nicht im Büro, will DIr aber erst einmal danken für Deine Antwort.
Welches Tool das ist weiß ich nicht.
Ich gebe im Konsolenfenster: Regex "Dateiname" -P "Mein Pattern"
ein. Eigene Installationen sind nicht zugelassen.
Das Problem was ich bis jetzt mit Deinen Lösungen hatte ist das ich kein Replace eingeben kann.
cu Taurec
leider bin ich nicht im Büro, will DIr aber erst einmal danken für Deine Antwort.
Welches Tool das ist weiß ich nicht.
Ich gebe im Konsolenfenster: Regex "Dateiname" -P "Mein Pattern"
ein. Eigene Installationen sind nicht zugelassen.
Das Problem was ich bis jetzt mit Deinen Lösungen hatte ist das ich kein Replace eingeben kann.
cu Taurec
Brauchst du ja nicht zu machen, wenn dein Tool so funktioniert.T_a_u_r_e_c wrote: Das Problem was ich bis jetzt mit Deinen Lösungen hatte ist das ich kein Replace eingeben kann.
Ich brauchte das, um ein Ergebnis zu sehen.
Benutze das Pattern einfach so wie du deins benutzt hattest,
(?siU)Datei .*/([^/]*).\w{5,6}".*
aber ohne 'U', da mein Pattern als 'greedy' aufgebaut ist:
(?si).*Datei:.+/(.+)".+
- - -
Welches "Konsolenfenster" meinst du denn? Das einer "DOS-Box"?
Dann ist "Regex" wohl ein extra Tool oder ein selbstgeschriebenes Skript.
- - -
-
- Junior Member
- Posts: 21
- Joined: 2015-07-17, 06:28 UTC