Precisa de uma mão com grep + regex

2

Estou tentando encontrar o conjunto de palavras (se houver) que contém dois e s consecutivos e também contém dois ys. Mas até agora eu tentei seguir os 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's ou dois e consecutivos, mas não fornecem uma palavra que contenha ambas as condições. O que devo fazer agora?

    
por Batman 26.04.2017 / 06:37

3 respostas

3

Estou assumindo que seu arquivo se parece com algo assim:

beeyy yeey open iee eey yeefy
funny reenydy jyyee

e é chamado words2.txt . Sim, o conteúdo é aleatório. Isso exibirá o conjunto de palavras contendo caracteres ee e dois y 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 e consecutivos, depois grep s novamente por dois (possivelmente não consecutivos) y . Como cada grep é um filtro, o resultado final é o conjunto de palavras contendo as duas% consecutivasee e duas y .

Na minha entrada, o resultado é:

beeyy
yeey
yeefy
reenydy
jyyee
    
por 26.04.2017 / 06:49
2

Supondo que você queira exatamente dois y s e não pelo menos dois y s , com o GNU grep se construído com suporte a PCRE:

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

Ou com o ast-open grep (2014- 01-26 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 de exatamente dois e s (e não 3 ou mais), por exemplo, corresponde a eeyy ou eeyyeee , mas não eeeyy ), com GNU grep -P :

grep -Pow '(?=\w*y\w*y)(?!\w*y\w*y\w*y)\w*(?<!e)ee(?!e)\w*'
    
por 27.04.2017 / 13:30
1

Apenas uma variante da resposta de Fox:

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

se você quiser exatamente 2 y s:

... | grep -v 'y.*y.*y' 
    
por 27.04.2017 / 13:27