
Ich versuche, die Menge der Wörter (falls vorhanden) zu finden, die zwei aufeinanderfolgende e's und auch zwei y's enthalten. Aber bisher habe ich versucht, den folgenden Befehlen zu folgen,
grep -e '[y&y].*[ee]' -e '[y&y].*[ee]' words2.txt
grep -e 'y.y' -e 'ee' words2.txt
grep -X '.*[y.y].*&.*[ee].*' words2.txt
grep -X '.[*y.y].*&.[*ee].*' words2.txt
Einige dieser Befehle geben entweder zwei y's oder zwei aufeinanderfolgende e's zurück, aber kein Wort, das beide Bedingungen erfüllt. Was soll ich jetzt tun?
Antwort1
Ich gehe davon aus, dass Ihre Datei ungefähr so aussieht:
beeyy yeey open iee eey yeefy
funny reenydy jyyee
und heißt words2.txt
. Ja, der Inhalt ist irgendwie zufällig. Dies zeigt die Menge der Wörter an, die aufeinanderfolgende ee
und zwei y
Zeichen enthalten:
< words2.txt tr ' ' '\n' | grep 'ee' | grep 'y.*y'
Dadurch wird zunächst sichergestellt, dass jedes Wort in einer eigenen Zeile mit steht tr
, dann grep
mit s für zwei aufeinanderfolgende e
, dann grep
erneut mit s für zwei (möglicherweise nicht aufeinanderfolgende) y
. Da es sich bei jedem grep
um einen Filter handelt, ist das Endergebnis die Menge der Wörter, die sowohl aufeinanderfolgende ee
als auch zwei enthalten y
.
Das Ergebnis meiner Eingabe ist:
beeyy
yeey
yeefy
reenydy
jyyee
Antwort2
Vorausgesetzt, Sie wollengenau zwei y
s und nichtmindestens zwei y
s, mit GNU, grep
wenn mit PCRE-Unterstützung erstellt:
grep -Pow '(?=\w*y\w*y)(?!\w*y\w*y\w*y)\w*ee\w*'
Oder mitast-offengrep
(26.01.2014 oder neuer):
grep -Xow '\w*ee*\w*&\w*y\w*y\w*&(\w*y\w*y\w*y\w*)!'
Wenn Sie außerdem mindestens eine Sequenz vongenau zwei e
s (und nicht 3 oder mehr), das heißt zum Beispiel match on eeyy
oder eeyyeee
but not eeeyy
), mit GNU grep -P
:
grep -Pow '(?=\w*y\w*y)(?!\w*y\w*y\w*y)\w*(?<!e)ee(?!e)\w*'
Antwort3
Nur eine Variante von Fox‘ Antwort:
grep -Po '\w*ee\w*' words.txt | grep 'y.*y'
wenn du genau 2 y
s willst:
... | grep -v 'y.*y.*y'