정규식이 /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개 있는 줄에는 a
4개의 필드가 있습니다)
또는 Perl의 연산자를 사용하여 tr
각 줄의 s 수를 계산합니다.a
perl -ne 'print if (tr/a/a/ == 3)' /usr/share/dict/words
이 연산자는 만들어진 음역 수를 반환하며, 실제 출력이 수정되지 않도록 각 음역을 a
다른 음역으로 대체합니다.a