Precisa de ajuda com grep + regex

Precisa de ajuda com grep + regex

Estou tentando encontrar o conjunto de palavras (se houver) que contém dois e consecutivos e também contém dois y. Mas até agora tentei seguir comandos,

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

alguns desses comandos fornecem dois y ou dois e consecutivos, mas não fornecem uma palavra que contenha ambas as condições. O que eu deveria fazer agora?

Responder1

Presumo que seu arquivo seja parecido com isto:

beeyy yeey open iee eey yeefy
funny reenydy jyyee

e é chamado words2.txt. Sim, o conteúdo é meio aleatório. Isso exibirá o conjunto de palavras contendo eedois ycaracteres consecutivos:

< words2.txt tr ' ' '\n' | grep 'ee' | grep 'y.*y'

Isso primeiro garante que cada palavra esteja em sua própria linha com tr, depois greps por dois consecutivos ee greps novamente por dois (possivelmente não consecutivos) y. Como cada um grepé um filtro, o resultado final é o conjunto de palavras contendo consecutivos eee dois y.

Na minha entrada, o resultado é:

beeyy
yeey
yeefy
reenydy
jyyee

Responder2

Supondo que você queiraexatamente dois yé e nãopelo menos dois ysegundos, com GNU grepse construído com suporte PCRE:

grep -Pow '(?=\w*y\w*y)(?!\w*y\w*y\w*y)\w*ee\w*'

Ou comast-abertogrep(26/01/2014 ou mais recente):

grep -Xow '\w*ee*\w*&\w*y\w*y\w*&(\w*y\w*y\w*y\w*)!'

Se você também quiser pelo menos uma sequência deexatamente dois es (e não 3 ou mais), que é, por exemplo, match on eeyyor eeyyeeebut not eeeyy), com GNU grep -P:

grep -Pow '(?=\w*y\w*y)(?!\w*y\w*y\w*y)\w*(?<!e)ee(?!e)\w*'

Responder3

Apenas uma variante da resposta da Fox:

grep -Po '\w*ee\w*'  words.txt | grep 'y.*y'

se você quiser exatamente 2 ys:

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

informação relacionada