perl -Mopen=locale -e '
$_="@ARGV";
printf "upper: %d\nlower: %d\n", y/A-Z//, y/a-z//' -- "$myvar"
Imprimiria o número de ocorrências de caracteres ABCDEFGHIJKLMNOPQRSTUVWXYZ e abcdefghijklmnopqrstuvwxyz no conteúdo de $myvar
.
com zsh
:
printf 'upper: %d\nlower: %d\n' ${#myvar//[^A-Z]} ${#myvar//[^a-z]}
Com ksh
ou bash
:
upper=ABCDEFGHIJKMLNOPQRSTUVWXYZ
lower=abcdefghijklmnopqrstuvwxyz
u=${myvar//[^$upper]} l=${myvar//[^$lower]}
printf 'upper: %d\nlower: %d\n' "${#u}" "${#l}"
POSIXly:
upper=ABCDEFGHIJKMLNOPQRSTUVWXYZ
lower=abcdefghijklmnopqrstuvwxyz
u=$(printf %s "$myvar" | tr -cd "$upper" | wc -m)
l=$(printf %s "$myvar" | tr -cd "$lower" | wc -m)
printf 'upper: %d\nlower: %d\n' "$u" "$l"
Embora tenha cuidado, algumas implementações de tr
como o GNU tr
não são compatíveis e podem contar partes de caracteres que têm a mesma codificação que as letras ASCII. Por exemplo, em um zh_HK.big5hkscs
locale em um sistema GNU:
$ LC_ALL=zh_HK.big5hkscs luit
$ printf Э | tr -cd ABCDEFGHIJKLMNOPQRSTUVWXYZ | wc -c
1
Como lá, a codificação de Э
contém a codificação de R
:
$ printf Э | hd
00000000 c8 52 |.R|
00000002