[英]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
對於可識別語言環境的解決方案,因此也可以使用帶重音符號 的解決方案 ,請使用:
EITHER: fedorqui基於grep
的有用的answer的[[:upper:]]
變體。
或: 威廉·珀塞爾 ( William Pursell)優雅但有缺陷的答案的以下變體 :
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),這意味着如果當前目錄恰好包含名為:
, u
, p
, e
或r
,則[:upper:]
會擴展他們的名字,這顯然是不希望的。 原因是外殼程序將未引用的[:upper:]
視為字符類 。 wc -c
可以計數字節 ,它恰好可以與AZ
,因為根據定義,所有匹配的字母都是單字節字符; 但是為了區域設置意識而切換到[:upper:]
必須切換到wc -m
,以便正確計數(可能是多字節) 字符 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.