ASCII値を使用して文字列の大文字と小文字の数を見つけるには、シェルスクリプトを使用することをお勧めします。
答え1
perl -Mopen=locale -e '
$_="@ARGV";
printf "upper: %d\nlower: %d\n", y/A-Z//, y/a-z//' -- "$myvar"
ABCDEFGHIJKLMNOPQRSTUVWXYZおよびabcdefghijklmnopqrstuvwxyz文字の発生回数が印刷されます$myvar
。
そしてzsh
:
printf 'upper: %d\nlower: %d\n' ${#myvar//[^A-Z]} ${#myvar//[^a-z]}
またはksh
:bash
upper=ABCDEFGHIJKMLNOPQRSTUVWXYZ
lower=abcdefghijklmnopqrstuvwxyz
u=${myvar//[^$upper]} l=${myvar//[^$lower]}
printf 'upper: %d\nlower: %d\n' "${#u}" "${#l}"
POSIX的に:
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"
しかし、GNUのようないくつかのtr
実装はtr
互換性がなく、ASCII文字と同じエンコーディングを持つ文字部分を計算することができます。たとえば、zh_HK.big5hkscs
GNUシステムのロケールでは、次のようになります。
$ LC_ALL=zh_HK.big5hkscs luit
$ printf Э | tr -cd ABCDEFGHIJKLMNOPQRSTUVWXYZ | wc -c
1
のエンコーディングには、Э
次のエンコーディングが正確に含まれますR
。
$ printf Э | hd
00000000 c8 52 |.R|
00000002
答え2
牛に似た一種の栄養awk
解決策:
s="Kyiv is the city of Archistratigus Michael ..."
awk 'BEGIN{ FPAT="[a-zA-Z]"; l=u=0 }
{
for (i=1; i<=NF; i++) ($i~/[a-z]/)? l++ : u++;
printf "upper: %d, lower: %d\n", l, u
}' <<<"$s"
出力:
upper: 33, lower: 3
FPAT="[a-zA-Z]"
- フィールド値のパターンを定義します。 (大文字と小文字のみが考慮されます。)
答え3
答え4
文字列の小文字数を計算します。
for i in {a..z}; do
echo "Praven" | awk -v i="$i" '$1~i {print i}';
done | wc -l
出力
5
大文字を検索するには、a..z
に置き換えますA..Z
。