![用于计算字符串输入中大写和小写字符数量的 Shell 脚本](https://linux22.com/image/123836/%E7%94%A8%E4%BA%8E%E8%AE%A1%E7%AE%97%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BE%93%E5%85%A5%E4%B8%AD%E5%A4%A7%E5%86%99%E5%92%8C%E5%B0%8F%E5%86%99%E5%AD%97%E7%AC%A6%E6%95%B0%E9%87%8F%E7%9A%84%20Shell%20%E8%84%9A%E6%9C%AC.png)
建议使用 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]}
与ksh
或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"
但请注意,像 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
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
答案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
。