
나는 두 개의 연속된 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
다음 grep
s는 연속된 2개 e
, grep
다시 s는 2개(비연속적일 수 있음)를 의미합니다 y
. 각각은 필터이므로 최종 결과는 연속 및 두 개를 grep
모두 포함하는 단어 집합입니다 .ee
y
내 입력 결과는 다음과 같습니다.
beeyy
yeey
yeefy
reenydy
jyyee
답변2
당신이 원한다고 가정정확히 2개 y
s 그리고 아니적어도 2 y
초grep
, 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개 e
s (3개 이상이 아님), 즉 예를 들어 eeyy
or 와 일치하지만 GNU에서는 일치 eeyyeee
하지 않음 :eeeyy
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'