OFF-TOPIC]Regex hilfe: suche bestimmten Teil aus einer Zeile

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
T_a_u_r_e_c
Junior Member
Junior Member
Posts: 21
Joined: 2015-07-17, 06:28 UTC

OFF-TOPIC]Regex hilfe: suche bestimmten Teil aus einer Zeile

Post by *T_a_u_r_e_c »

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.
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

RegEx: extrahiere Teilstring aus Zeile Textdatei

Post by *Stefan2 »

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.

 
T_a_u_r_e_c
Junior Member
Junior Member
Posts: 21
Joined: 2015-07-17, 06:28 UTC

Post by *T_a_u_r_e_c »

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
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

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.
Eine Pfadangabe enthält normalerweise umge\kehrte\Schräg\striche als Trennzeichen,
keine 'normalen' Schrägstriche und würde somit nicht stören. Bei dir nicht?

Also, wie oben erwähnt:
Stefan wrote:
VORHER:



NACHHER:











 
T_a_u_r_e_c
Junior Member
Junior Member
Posts: 21
Joined: 2015-07-17, 06:28 UTC

Post by *T_a_u_r_e_c »

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.
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

Ahhh, so nach und nach kommen die Details ans Licht. 'Netzwerk-Pfad' also :wink: , 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 :oops:
Last edited by Stefan2 on 2016-04-29, 06:36 UTC, edited 1 time in total.
T_a_u_r_e_c
Junior Member
Junior Member
Posts: 21
Joined: 2015-07-17, 06:28 UTC

Post by *T_a_u_r_e_c »

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
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

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.
Brauchst du ja nicht zu machen, wenn dein Tool so funktioniert.
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.
- - -


 
T_a_u_r_e_c
Junior Member
Junior Member
Posts: 21
Joined: 2015-07-17, 06:28 UTC

Post by *T_a_u_r_e_c »

Hallo Stefan2,

Du bist klasse,
jetzt funktioniert es.
Ich kann jetzt weiter "basteln" :-)
Danke Dir.

cu Taurec

P.S. Ja das eine DOS-Box. Frag mich aber bitte nicht was dahinter steckt
Ich musste schon "betteln" um überhaupt zugriff darauf zu bekommen.
Post Reply