计算单词中的大写字符

时间:2015-05-20 15:35:32

标签: linux string shell uppercase

我需要计算一个单词中有多少个大写字母。我怎么能这样做?

3 个答案:

答案 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>

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:]:up会扩展为他们的名字,这显然是不受欢迎的。原因是shell将不带引号的e视为字符类
  • r计算字节,恰好与[:upper:]一起使用,因为根据定义,所有匹配的字母都是单字节字符;但切换到[:upper:]以获取区域设置感知需要切换到wc -c,以便正确计算(可能是多字节)字符