我需要计算一个单词中有多少个大写字母。我怎么能这样做?
答案 0 :(得分:2)
我会使用grep -o '[A-Z]'
来匹配大写字母,然后计算发生这种情况的次数:
$ grep -o '[A-Z]' <<< "heLLo" | wc -l
2
甚至更好(thanks mklement0,始终提供良好的信息!),使用[[:upper:]]
,以便大写也将考虑您的语言环境中定义的那些:
$ grep -o '[[:upper:]]' <<< "heLLo" | wc -l
2
答案 1 :(得分:1)
我喜欢tr:
echo "$word" | tr -dc A-Z | wc -c
只需删除所有非大写的字符并计算剩下的字符。
您可能更喜欢tr -dc [:upper:]
,但我发现A-Z更易于使用。
答案 2 :(得分:0)
<强> TL;博士强>
对于 区域设置感知 的解决方案,因此也适用于重音字符,请使用:< / p>
EITHER:fedorqui's helpful grep
-based answer的[[:upper:]]
变体。
echo "heLLÖ, world" | tr -dC '[:upper:]' | wc -m # -> 3
需要进行更改才能正确处理非ASCII,多字节编码的字符 继续阅读以获得详细解释。
使上述命令识别区域设置的关键:
tr
的{{1}}选项使用基于字符的补码,而-C
则使用字节<基于/ em>的补充;虽然-c
和-c
在某些-C
实施中的行为相同,但POSIX defines only -C
as the locale-aware variant。
tr
确保使用活动区域设置定义构成大写字符的内容,而[:upper:]
仅包含 unaccented (仅限ASCII)从“A”到“Z”的字母。
A-Z
的{{1}}选项计算字符(可能包含现在流行的UTF-8编码中的多个字节);相比之下,wc
计算字节,在上面的示例中,它将报告 4 而不是预期的3,因为-m
被编码为 2 字节。
现在让我们看一下威廉回答的陈述:
您可能更喜欢
-c
,但我发现Ö
更容易使用。
tr -dc [:upper:]
和A-Z
可以互换使用,选择一个而不是另一个仅仅是偏好或方便的问题 - 但是,如上所述,[:upper:]
是区域设置感知,而A-Z
不是。[:upper:]
不带引号会使其受路径名扩展(globbing)的影响,这意味着如果当前目录恰好包含名为A-Z
的文件,{{ 1}},[:upper:]
,:
或u
,p
会扩展为他们的名字,这显然是不受欢迎的。原因是shell将不带引号的e
视为字符类。r
计算字节,恰好与[:upper:]
一起使用,因为根据定义,所有匹配的字母都是单字节字符;但切换到[:upper:]
以获取区域设置感知需要切换到wc -c
,以便正确计算(可能是多字节)字符。