grep - 문자열에서 정확히 3개의 a를 찾는 정규 표현식

grep - 문자열에서 정확히 3개의 a를 찾는 정규 표현식

정규식이 /usr/share/dict/words에 포함된 단어와 일치하도록 다음 명령을 변경하고 싶습니다.정확히대신에 3a적어도3시

cat /usr/share/dict/words | grep "a.*a.*a" | grep -v "'s$" | wc -l

어떻게 해야 하나요?

답변1

(모든 문자와 일치 ) 대신 (를 [^a]제외한 모든 문자와 일치)를 사용하는 방법은 다음과 같습니다 .a.

$ grep -E '^([^a]*a){3}[^a]*$' /usr/share/dict/cracklib-small | shuf -n 4
areaway
humanitarian
capitalizations
autonavigator

이와 같이 정규식을 작성하여 ^[^a]*(a[^a]*){3}$동일한 결과를 얻을 수도 있습니다.

또한 다른 수의 a가 필요할 때 ^[^a]*a[^a]*a[^a]*a[^a]*$크기 조정이 이루어지지 않습니다 . 성능은 훨씬 더 좋지만, 기가바이트의 데이터를 처리하지 않는 한 별 문제가 되지 않습니다.

^정규 표현식과 앵커 연산자를 명시적으로 사용하는 대신 암시적으로 이 작업을 수행하는 옵션을 사용할 수도 있습니다 . 대소문자를 구분하지 않는 일치 옵션도 참조하세요(로캘에 따라 다름).$-x-i

grep -xiE '([^a]*a){3}[^a]*'

답변2

동일한 종류의 패턴을 사용하여 "최소 4 a초"를 감지하고 일치 항목의 의미를 반대로 바꿉니다.

grep 'a.*a.*a' /usr/share/dict/words | grep -v 'a.*a.*a.*a'

또는,

grep '\(a.*\)\{3\}' /usr/share/dict/words | grep -v '\(a.*\)\{4\}'

또는,

grep -E '(a.*){3}' /usr/share/dict/words | grep -v -E '(a.*){4}'

또는 with를 필드 구분 기호로 사용하고 필드 수를 계산합니다 awk.a

awk -F a 'NF == 4' /usr/share/dict/words

(s가 3개 있는 줄에는 a4개의 필드가 있습니다)


또는 Perl의 연산자를 사용하여 tr각 줄의 s 수를 계산합니다.a

perl -ne 'print if (tr/a/a/ == 3)' /usr/share/dict/words

이 연산자는 만들어진 음역 수를 반환하며, 실제 출력이 수정되지 않도록 각 음역을 a다른 음역으로 대체합니다.a

관련 정보