用于计算字符串输入中大写和小写字符数量的 Shell 脚本

用于计算字符串输入中大写和小写字符数量的 Shell 脚本

建议使用 shell 脚本来使用 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]}

kshbash

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"

但请注意,像 GNU 这样的一些tr实现tr不兼容,并且可能会计算恰好与 ASCII 字母具有相同编码的字符部分。例如在zh_HK.big5hkscsGNU 系统上的语言环境中:

$ LC_ALL=zh_HK.big5hkscs luit
$ printf Э | tr -cd ABCDEFGHIJKLMNOPQRSTUVWXYZ | wc -c
1

在那里, 的编码Э恰好包含 的编码R

$ printf Э | hd
00000000  c8 52                                             |.R|
00000002

答案2

GNUawk解决方案:

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

要计算字符数,您可以使用grep和一个简单的正则表达式;和...一起t厕所

myVar="Valdeir Psr"
echo -n $myVar | grep -o [A-Z] | tr -d "\n" | wc -m

每个命令的作用:

echo -n --> 打印变量的值

grep -o [A-Z] --> 过滤大写字母

tr -d "\n" --> 删除换行符

wc -m --> 打印字符数

要计算小写字符,只需替换[A-Z][a-z]

答案4

计算字符串中小写字符的数量:

for i in {a..z}; do
  echo "Praven" | awk -v i="$i" '$1~i {print i}';
done | wc -l

输出

5

要查找大写字符,请替换a..zA..Z

相关内容