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
.