Cygwin - egrep-Befehl zum Suchen von Mustern in einer gegebenen Textdatei

Cygwin - egrep-Befehl zum Suchen von Mustern in einer gegebenen Textdatei

Ich wurde gebeten, die Menge der Wörter zu finden, die mit einer Teilzeichenfolge der Länge 3 beginnen, die die Zeichen a, b und c enthält und zusätzlich eine weitere disjunkte Teilzeichenfolge mit denselben 3 Zeichen enthält.

Beispiel: abcacb acbbac

hilf mir, einen regulären Ausdruck dafür zu finden. Danke

Bearbeiten: abcbac – a, b, c sollten die ersten drei Buchstaben sein, dann sollten a, b, c ihre Reihenfolge gegenüber den vorherigen drei Buchstaben ändern. Nur 6 Zeichenfolgen.

acbbca abccba bacbca usw....

Antwort1

(Lösungen setzen hier GNU voraus, grepwenn sie mit PCRE-Unterstützung erstellt werden (wie es normalerweise bei Cygwin der Fall ist)).

Die erste Hälfte Ihrer Anforderungen würde bedeuten.

grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*(?1)\w*'

Oder möglicherweise:

grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*\1\w*'

Für die zweite Hälfte scheint das im Widerspruch zur ersten Hälfte zu stehen:

grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'

Finde dieWörter(Wortdefiniert als eine Zeichenfolge in diesem Fall), die mit einer Folge von 3 Zeichen beginnt , [a-zA-Z0-9_]die aus und besteht (jeweils einem), gefolgt von einer weiteren dieser Folgen ( die sich auf denselben regulären Ausdruck wie in der ersten Gruppe bezieht), vorausgesetzt, sie ist nicht identisch mit der ersten ( bezieht sich auf die Zeichenfolge, die von der ersten Erfassungsgruppe gefunden wurde und ist eineabc(?1)(...)\1(...)(?!...)negativer Blick nach vornOperator).

$ echo abcbca abcbcax abcabc aaabbb xcabacb abcacb-blah |
    grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
abcbca
abcacb

Antwort2

Das hier sollte genügen:

grep -Ew '[a-c]{3}.*[a-c]{3}'
  • -Eum reguläre Ausdrücke abzugleichen
  • -wum nur Wörter abzugleichen
  • [a-c]{3}wird genau 3 Zeichen aus dem a-cSatz entsprechen
  • .*passt zu allem zwischen

verwandte Informationen