나는 두 개의 연속된 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는 두 개의 연속된 단어를 나타내고 e
다시 grep
s는 두 개의(비연속적인) 단어를 나타냅니다 y
. 각각은 필터이므로 최종 결과는 grep
Continuous와 Two를 포함하는 단어 집합입니다.ee
y
내 입력에 따르면 결과는 다음과 같습니다.
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개 e
s (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'