
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.txt
durch beide grep
Aufrufe zu filtern, sollte dies so aussehen
grep -E '^.{10}$' words2.txt | grep 'a*.e*.i*.o*.u*'
Das zweite grep
Muster sollte sein [auoie]{3}
, was uns zu
grep -E '^.{10}$' words2.txt | grep -E '[aouie]{3}'
Die Eingabe für den ersten grep
ist Ihre Datei. Die Eingabe für den zweiten grep
ist 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 awk
und historische Implementierungen vor POSIX unterstützen in regulären Ausdrücken awk
nicht{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 grep
integrierter 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, -o
wenn Ihre grep
Implementierung 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).