
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 ee
dois y
caracteres 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 grep
s por dois consecutivos e
e grep
s novamente por dois (possivelmente não consecutivos) y
. Como cada um grep
é um filtro, o resultado final é o conjunto de palavras contendo consecutivos ee
e dois y
.
Na minha entrada, o resultado é:
beeyy
yeey
yeefy
reenydy
jyyee
Responder2
Supondo que você queiraexatamente dois y
é e nãopelo menos dois y
segundos, com GNU grep
se 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 e
s (e não 3 ou mais), que é, por exemplo, match on eeyy
or eeyyeee
but 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 y
s:
... | grep -v 'y.*y.*y'