연속 자음을 포함하지 않는 단어를 검색하기 위해 grep 명령을 사용하는 방법은 무엇입니까?

연속 자음을 포함하지 않는 단어를 검색하기 위해 grep 명령을 사용하는 방법은 무엇입니까?

grep -Ev '[^aeiouy]{2}'대답이 제공되어야 합니다(각 입력 줄에 ASCII 소문자로 구성된 하나의 단어만 포함되어 있다고 가정).

하지만 이를 수행할 수 있는 방법이 있습니까 -v?

답변1

양성 일치를 위해서는 자음이 있는 경우 자음이 뒤나 앞에 오지 않는지 확인하고, 각 자음 앞에는 초성 또는 모음이 오고 뒤에는 종성 또는 모음이 오는지 확인해야 합니다. .

그래서:

v='[aeiouy]' c='[^aeiouy]'
grep -xE "($c?$v)*$c?"
$ grep -cxE "($c?$v)*$c?" /usr/share/dict/words
11353
$ grep -cvE "$c$c" /usr/share/dict/words
11353
$ diff -s <(grep -xE "($c?$v)*$c?" /usr/share/dict/words) <(grep -vE "$c{2}" /usr/share/dict/words)
Files /proc/self/fd/11 and /proc/self/fd/18 are identical

답변2

사용행복하다(이전 Perl_6)

raku -ne '.put unless m:i/ <-[aeiouy]> ** 2 /;'

#OR

raku -ne '.put unless m:i/ <[bcdfghjklmnpqrstvwxz]> ** 2 /;'

OP가 게시된 솔루션이 처리할 수 없는 유니코드를 발견하는 경우 grep또 다른 옵션입니다 . 최근 MacOS(BSD?) grep 매뉴얼 페이지에 따르면:"grep 유틸리티는 유니코드 입력을 정규화하지 않으므로 결합 문자가 포함된 패턴은 분해된 입력과 일치하지 않으며 그 반대도 마찬가지입니다."(Raku는 유니코드 입력을 정규화할 수 있는 것으로 보고되었습니다. 아래 URL을 참조하세요).

위의 두 가지 솔루션을 비교해 보세요. 동일한 결과를 얻으려면 대소 :i문자를 구분하지 않는 일치를 사용해야 합니다.

~$ raku -ne 'state $i; ++$i unless m:i/ <-[aeiouy]> ** 2 /; END $i.say;' /usr/share/dict/words
38048
~$ raku -ne 'state $i; ++$i unless m:i/ <[bcdfghjklmnpqrstvwxz]> ** 2 /; END $i.say;' /usr/share/dict/words
38048
~$ diff -s <(raku -ne '.put unless m:i/ <-[aeiouy]> ** 2 /;' /usr/share/dict/words) <(raku -ne '.put unless m:i/ <[bcdfghjklmnpqrstvwxz]> ** 2 /;' /usr/share/dict/words)
Files /dev/fd/63 and /dev/fd/62 are identical

https://docs.raku.org/언어/unicode
https://raku.org

관련 정보