2013-02-27 64 views
23

我想使用Shell來統計字符串的字數。如何統計使用shell的字符串的字數

假設字符串是:

input="Count from this String" 

在這裏,定界符是空間' '和預期輸出爲4。 有,也可以在像"Count from this String "輸入字符串尾部空格字符。

如果字符串中有尾隨空格,它應該產生相同的輸出,即4.我該怎麼做?

+1

爲什麼downvote的問題?或者這是否意味着如果某人不知道某事並且其他人知道這一點,那麼他們可以簡單地冷靜下來。 – 2013-02-27 09:33:58

回答

30
echo "$input" | wc -w 

使用wc -w來計算單詞的數量。

或按羅布麻的建議下,回聲可以來擺脫以及:

wc -w <<< "$input" 

如果< < <不是由你的shell的支持,你可以試試這個變種:

wc -w << END_OF_INPUT 
$input 
END_OF_INPUT 
+6

這是[無用的回聲](http://fahdshariff.blogspot.com/2012/12/useless-use-of-echo.html)。改用'wc -w <<<「$ input」'。 – dogbane 2013-02-27 09:28:07

+0

感謝Tuxdude和dogbane的回覆。如果我使用wc -w <<<「$ input」我得到一個錯誤:**語法錯誤:得到<&,期待Word **。有任何想法嗎? – 2013-02-28 08:15:54

+0

你正在運行哪個shell? – Tuxdude 2013-02-28 17:41:45

27

您不需要像wc這樣的外部命令,因爲您可以使用純效率更高的bash

轉換串入一個數組,然後計數陣列中的元素:

$ input="Count from this String " 
$ words=($input) 
$ echo ${#words[@]} 
4 

或者,使用set到設定的位置參數,然後計算它們:

$ input="Count from this String " 
$ set -- $input 
$ echo $# 
4 
+3

第二個變體有一個副作用,它會覆蓋位置參數,就像從命令行或傳遞給函數的參數(如果這些行位於函數中)一樣。所以請確保在使用set之後不要依賴$ 1,$ 2等 - $ input – Tuxdude 2013-02-27 20:42:08

+0

@Tuxdude這非常重要。謝謝 – 2013-02-28 09:11:49

+0

@dogbane由你建議的第二種解決方案對我來說工作得很好,但正如Tuxdude指出的那樣,我不能用新的解決方案替換現有的參數,因爲它會打破目前的流程。我試圖實現第一個解決方案,但不幸的是我得到錯誤:**語法錯誤:得到(,期待換行** – 2013-02-28 09:15:07

5

要做到這一點在純粹的避免副作用,在一個子外殼:

$ input="Count from this string " 
$ echo $(IFS=' '; set -f; set -- $input; echo $#) 
4 

它與其它的分隔符,以及:

$ input="dog,cat,snake,billy goat,horse" 
$ echo $(IFS=,; set -f; set -- $input; echo $#) 
5 
$ echo $(IFS=' '; set -f; set -- $input; echo $#) 
2 

注意使用「設置-f」即禁用bash filename expansion在子shell,所以如果主叫方希望擴大其應事先做(帽尖@ mkelement0)。

+2

很好完成;我建議在每個'set'命令前加上'set -f;'(注意:必須是_separate_命令),以便(暫時)禁用路徑名擴展,這樣可以確保輸入令牌(如*)不會意外擴展 – mklement0 2014-04-11 04:21:22

3

嘗試使用以下的一行:

echo $(c() { echo $#; }; c $input) 

它基本上定義c()函數並傳遞$input作爲參數,然後返回$#在由空格隔開的參數元素的個數。要更改分隔符,您可以更改IFS(一個特殊變量)。

3
echo "$input" | awk '{print NF}' 
+0

我喜歡'NF-x'這個x是任意數字的事實,遠離不被計數的字段。 – PdC 2017-06-12 08:59:08

0

我就附和一個Perl一行代碼(避免 '沒用使用echo'):

perl -lane 'print scalar(@F)' <<< $input 
相關問題