簡體   English   中英

計算單詞中的大寫字符

[英]Count uppercase characters in a word

我需要計算一個單詞中有多少個大寫字母。 我怎樣才能做到這一點?

我將使用grep -o '[AZ]'來匹配大寫字母,然后計算發生這種情況的次數:

$ grep -o '[A-Z]' <<< "heLLo" | wc -l
2

甚至更好( 感謝mklement0 ,始終提供良好的信息!),請使用[[:upper:]]以便大寫字母也將考慮您的語言環境中定義的那些:

$ grep -o '[[:upper:]]' <<< "heLLo" | wc -l
2

我喜歡這個:

echo "$word" | tr -dc A-Z | wc -c

只需刪除所有不是大寫的字符並計算剩余的字符。

您可能更喜歡tr -dc [:upper:] ,但我發現AZ更易於使用。

tl; dr

對於識別語言環境的解決方案,因此也可以使用帶重音符號 的解決方案 ,請使用:

echo "heLLÖ, world" | tr -dC '[:upper:]' | wc -m  # -> 3

需要進行這些更改才能正確處理非ASCII,多字節編碼的字符。
請繼續閱讀以獲取詳細說明。


使上述命令具有區域設置意識的關鍵:

  • tr-C選項使用基於字符的補碼,而不是-c使用基於字節的補碼; 雖然-c-C在某些tr實現中的行為可能相同,但是POSIX僅將-C定義為可識別語言環境的變量

  • [:upper:]確保使用構成大寫字符的有效語言環境的定義,而AZ僅包含從“ A”到“ Z”的不帶重音 (僅ASCII)的字母。

  • wc-m選項對字符進行計數(以現在流行的UTF-8編碼可以包括多個字節); 相反, -c計算bytes ,在上面的示例中,它將報告4而不是預期的3,因為Ö被編碼為2個字節。


現在讓我們看一下威廉的回答:

您可能更喜歡tr -dc [:upper:] ,但我發現AZ更易於使用。

  • 這錯誤地暗示了[:upper:]AZ可以互換使用,而選擇一個僅僅是一個偏好或方便的問題-但是,如上所述, [:upper:]是區域感知的,而AZ是不。
  • 另外,使用[:upper:] 引號會使它經受路徑名擴展(globbing),這意味着如果當前目錄恰好包含名為:uper ,則[:upper:]會擴展他們的名字,這顯然是不希望的。 原因是外殼程序將未引用的[:upper:]視為字符類
  • wc -c可以計數字節 ,它恰好可以與AZ ,因為根據定義,所有匹配的字母都是單字節字符; 但是為了區域設置意識而切換到[:upper:]必須切換到wc -m ,以便正確計數(可能是多字節) 字符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM