grep+regex에 대한 도움이 필요합니다.

grep+regex에 대한 도움이 필요합니다.

나는 두 개의 연속된 e와 두 개의 y(있는 경우)를 포함하는 단어 집합을 찾으려고 합니다. 하지만 지금까지 나는 다음 명령을 시도했습니다.

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

이러한 명령 중 일부는 두 개의 y 또는 두 개의 연속적인 e를 제공하지만 두 조건 중 하나를 포함하는 단어는 제공하지 않습니다. 이제 어떻게 해야 하나요?

답변1

귀하의 파일이 다음과 같다고 가정합니다.

beeyy yeey open iee eey yeefy
funny reenydy jyyee

words2.txt네, 내용이 좀 무작위 예요 . 그러면 연속 문자 ee와 두 문자가 포함된 y단어 세트가 표시됩니다 .

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

이렇게 하면 먼저 각 단어가 한 줄에 있는지 확인한 tr다음 greps는 두 개의 연속된 단어를 나타내고 e다시 greps는 두 개의(비연속적인) 단어를 나타냅니다 y. 각각은 필터이므로 최종 결과는 grepContinuous와 Two를 포함하는 단어 집합입니다.eey

내 입력에 따르면 결과는 다음과 같습니다.

beeyy
yeey
yeefy
reenydy
jyyee

답변2

당신이 원한다고 가정정확히 2개 y응보다는적어도 y두 개grep, PCRE 지원으로 빌드하는 경우 GNU 사용:

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

또는완전 개방grep(2014년 1월 26일 또는 업데이트됨):

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

적어도 하나의 시퀀스를 원하는 경우정확히 2개 es (3개 이상 대신), 즉 일치하거나 eeyy일치 eeyyeee하지 않음 eeeyy), GNU 사용 grep -P:

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

답변3

Fox의 답변이 변형되었습니다.

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

정확히 2초를 원하는 경우 y:

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

관련 정보