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는 연속된 2개 e, grep다시 s는 2개(비연속적일 수 있음)를 의미합니다 y. 각각은 필터이므로 최종 결과는 연속 및 두 개를 grep모두 포함하는 단어 집합입니다 .eey

내 입력 결과는 다음과 같습니다.

beeyy
yeey
yeefy
reenydy
jyyee

답변2

당신이 원한다고 가정정확히 2개 ys 그리고 아니적어도 2 ygrep, PCRE 지원으로 구축된 경우 GNU 사용 :

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

아니면완전 개방grep(2014-01-26 이상):

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

또한 최소한 하나의 시퀀스를 원하는 경우정확히 2개 es (3개 이상이 아님), 즉 예를 들어 eeyyor 와 일치하지만 GNU에서는 일치 eeyyeee하지 않음 :eeeyygrep -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' 

관련 정보