Brauche Hilfe mit grep+regex

Brauche Hilfe mit grep+regex

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 eeund zwei yZeichen 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 grepmit s für zwei aufeinanderfolgende e, dann greperneut mit s für zwei (möglicherweise nicht aufeinanderfolgende) y. Da es sich bei jedem grepum einen Filter handelt, ist das Endergebnis die Menge der Wörter, die sowohl aufeinanderfolgende eeals auch zwei enthalten y.

Das Ergebnis meiner Eingabe ist:

beeyy
yeey
yeefy
reenydy
jyyee

Antwort2

Vorausgesetzt, Sie wollengenau zwei ys und nichtmindestens zwei ys, mit GNU, grepwenn 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 es (und nicht 3 oder mehr), das heißt zum Beispiel match on eeyyoder eeyyeeebut 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 ys willst:

... | grep -v 'y.*y.*y' 

verwandte Informationen