Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: [DE] [gelöst] Klammerpaare finden mit egrep (regex)  (Read 6716 times)

Offline bluelupo

  • User
  • Posts: 2.068
    • BluelupoMe
[DE] [gelöst] Klammerpaare finden mit egrep (regex)
« on: 2014/01/31, 19:10:26 »
Hallo zusammen,
ich habe gerade ein kniffeliges Problem mit Regulären Ausdrücken. Ich suche in Zeile mindestens 3 oder mehr eckige Klammerpaare [].

Der zu durchsuchende Text:
Code: [Select]
DFN-CERT-2014-0056 Oracle Secure Desktop: Mehrere Schwachstellen erlauben verschiedene Angriffe [Solaris][Windows]
DFN-CERT-2014-0046 Adobe Flash Player, AIR: Schwachstellen ermöglichen das Ausführen beliebigen Programmcodes [Linux][SuSE][Windows]
DFN-CERT-2014-0017 NTP: Missbrauch des monlist Kommandos ermöglicht einen Denial-of-Service-Angriff [][Linux][Fedora][RedHat][Unix][AIX][FreeBSD][NetBSD][Windows][Netzwerk]

Von dieser Datei möchte die Zeilen die 3 oder mehr eckige Klammerpaare enthalten.

Ich habe mir gedacht das geht so:
Code: [Select]
$ egrep '\[[A-Z,a-z]\]{3,}'

...das liefert aber leider nichts. Ich interpretiere meine selbst gebastelten Ausdruck so:
Suche eine eckige öffnende Klammer...
danach Zeichen aus der Klasse Groß- bzw. Kleinbuchstaben...
danach eine schließende eckige Klammer...
das ganze eben mindestens dreimal oder öfter.

Wie gehts richtig?
« Last Edit: 2014/01/31, 22:52:26 by bluelupo »

Offline bluelupo

  • User
  • Posts: 2.068
    • BluelupoMe
Re: Klammerpaare finden mit egrep (regex)
« Reply #1 on: 2014/01/31, 22:49:38 »
Wenn man sich lange damit herum schlägt bekommt man auch eine Lösung ;-)

Code: [Select]
$ egrep '(\[([A-Za-z]+)\]){3,}' regex.txt

..liefert hier im Beispiel alle Zeilen mit mindestens drei Klammerpaaren (ohne leere Klammerpaare). Das ganze Problem ist hier die Gruppierung mit den Klammern und das Entwerten durch den Backslash der eckigen Klammern [], da dies Sonderzeichen für egrep sind.

Man sucht nach einer eckigen Klammer --> (\[

...danach die Zeichenklasse der Groß- und Kleinbuchstaben (A-Z und a-z), die innerhalb der eckigen Klammern stehen muss --> [A-Za-z]

...die Zeichenklasse muss mindestens einmal vorkommen --> +

...abschließend muss die schließende eckige Klammer angegeben werden (entwertet) --> \])

...der ganze geklammerten Ausruck (in runden Klammern) muss mindestens 3mal (in geschweiften Klammer einzutragen) oder mehrmals vorkommen --> {3,}

Das war "hart" erkämpft  ;D
« Last Edit: 2014/01/31, 22:54:26 by bluelupo »

hefee

  • Guest
Re: [gelöst] Klammerpaare finden mit egrep (regex)
« Reply #2 on: 2014/01/31, 23:54:40 »
Ein klammernpaar kannst du aber trotzdem noch wegopimieren:

Code: [Select]
egrep '(\[[A-Za-z]+\]){3,}' regex.txt

Die innere Gruppierung ist in diesem Beispiel nicht notwendig, weil sie exakt aus einer regex anweisung besteht:
[A-Za-z]+

\[[A-Za-z]+\]{3,} reicht nicht weil dass auf folgende Strings matcht:
[a]]] oder [A]]]]]]]]]],...

Damit die der Operator {3,} auf den ganzen String zutrifft muss der gesammte String gruppiert werden mit ().