grep -Ev '[^aeiouy]{2}'
答えを提供する必要があります(各入力行にASCII小文字で構成される1つの単語のみが含まれていると仮定)。
しかし、これを行う方法はありますか-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が公開されたソリューションが処理できないUnicodeを検出する場合は、grep
別のオプションです。最近のMacOS(BSD?)grepのマニュアルページによると:「grepユーティリティはUnicode入力を正規化しないため、結合文字を含むパターンは分解された入力と一致せず、逆も同様です。」(RakuはUnicode入力を正規化できることが報告されています。以下のURLを参照してください)。
上記の2つの解決策を比較してください。同じ結果を得るには、大文字と小文字を: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