Grep und Regex erläutern

Grep und Regex erläutern

Satz von Wörtern, die 10 Zeichen lang sind und eine Teilzeichenfolge aus drei aufeinanderfolgenden Vokalen enthalten. Bisher habe ich diese Befehle ausprobiert.

grep -E '^.{10}$'| grep 'a*.e*.i*.o*.u*' words2.txt
grep -E '^.{10}$&a*.e*.i*.o*.u*' words2.txt

Eingabedaten, extrahiert per OCR vondieser Screenshot:

unpernicious
unperspicuous
unpervious
unpious
unpiteous
unpiteously
unpiteousness
unplebeian
unplenteous
unportmanteaued
unportuous
unprecarious
unprecious
unprecocious
unpredacious
unpresumptuous
unpresumptuously
unpretentious
unpretentiously
unpretentiousness
unpromiscuous
unpropitious
unpropitiously
unpropitiousness
unpugnacious
unpunctilious
unquailed
unquailing
unquailingly
unqueen
unqueened
unqueening
unqueenlike
unqueenly
unquiescence
unquiescent
unquiescently
unquiet
unquietable
unquieted
unquieting
unquietly
unquietness
unquietude
unrapacious
unrebellious
unreligious
unreligiously
unreligiousness
unrighteous
unrighteously
unrighteousness
unsacrilegious
Unsagacious
unsalubrious
unsanctimonious
unsanctimoniously
unsanctimoniousness
unsanguineous
unsanguineously
unseditious
unseeable
unseeing

Antwort1

Ihr Problem lässt sich (meiner Meinung nach) besser mit lösen awk, aber ich möchte nur auf ein Problem mit Ihrem Befehl hinweisen

grep -E '^.{10}$'| grep 'a*.e*.i*.o*.u*' words2.txt 

Um den Inhalt der Datei word2.txtdurch beide grepAufrufe zu filtern, sollte dies so aussehen

grep -E '^.{10}$' words2.txt | grep 'a*.e*.i*.o*.u*'

Das zweite grepMuster sollte sein [auoie]{3}, was uns zu

grep -E '^.{10}$' words2.txt | grep -E '[aouie]{3}'

Die Eingabe für den ersten grepist Ihre Datei. Die Eingabe für den zweiten grepist die Ausgabe des ersten grep.nichtdeine Datei.

Bei Verwendung eines POSIX awk(wie aktuelle Versionen von GNU awk):

$ awk 'length == 10 && /[aouei]{3}/' words2.txt
unpervious
unplebeian
unportuous
unprecious
unquailing
unqueening
unquieting
unquietude

mawk, BSD awkund historische Implementierungen vor POSIX unterstützen in regulären Ausdrücken awknicht{n}von Stéphane Chazelas hervorgehoben.

Antwort2

Sie hatten die 10 Zeichen richtig, aber um 3 Vokale in einer Reihe zu finden, suchen Sie nach einer Gruppe [AEIOU]:

egrep '^.{10}$' | egrep -i '[AEIOU]{3}'

Um Leerzeichen abzulehnen, verwenden Sie Folgendes:

egrep '^[^ \t]{10}$' | egrep -i '[AEIOu]{3}'

Antwort3

Ausgehend von 1 Wort/Zeile können Sie Folgendes tun:

sed -nE '/^.{10}$/!d;/[aAeEiIoOuU]{3}/p' words.txt

Antwort4

Mit grepintegrierter PCRE-Unterstützung:

grep -iPx '(?=.*[aeiou]{3}.*).{10}'

Oder:

grep -wiP '(?=\w*[aeiou]{3}\w*)\w{10}'

um nach diesen Wörtern zu suchen, wenn sie nicht einzeln pro Zeile vorkommen (fügen Sie hinzu, -owenn Ihre grepImplementierung dies unterstützt, um nur die übereinstimmenden Wörter auszugeben, anstatt die ganze Zeile, in der sie gefunden werden). EsWortbedeutet jede Folge vonWortZeichen (Buchstaben (in der lateinischen Schrift nur ohne diakritische Zeichen, fügen Sie (*UCP)für Buchstaben in jeder Schrift ein hinzu, obwohl das immer noch keine Vokale wie éoder abdeckt α), Ziffern und Unterstriche).

verwandte Informationen