52

シェルを使用して文字列から単語数を数えたい。

文字列が次のようになっているとします。

input="Count from this String"

ここで、区切り文字はスペース' 'であり、期待される出力は4です。入力文字列に。のような末尾のスペース文字が含まれる場合もあります"Count from this String "

文字列に末尾のスペースがある場合、同じ出力、つまり4が生成されるはずです。これを行うにはどうすればよいですか?

4

8 に答える 8

79
echo "$input" | wc -w

wc -wを使用して、単語数をカウントします。

または、dogbaneの提案に従って、エコーも取り除くことができます。

wc -w <<< "$input"

<<<がシェルでサポートされていない場合は、次のバリアントを試すことができます。

wc -w << END_OF_INPUT
$input
END_OF_INPUT
于 2013-02-27T09:19:40.953 に答える
48

より効率的wcなピュアで実行できるため、のような外部コマンドは必要ありません。bash

文字列を配列に変換してから、配列内の要素を数えます。

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

または、 を使用setして位置パラメーターを設定し、それらをカウントします。

$ input="Count from this String   "
$ set -- $input
$ echo $#
4
于 2013-02-27T09:35:09.250 に答える
9

副作用を避けて純粋な bash で実行するには、サブシェルで実行します。

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

他のセパレーターでも機能します。

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

サブシェルでのbash ファイル名の展開を無効にする「set -f」の使用に注意してください。したがって、呼び出し元が展開を希望する場合は事前に実行する必要があります (Hat Tip @mkelement0)。

于 2014-03-06T19:45:40.600 に答える
6

次のワンライナーを試してください。

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

c()基本的に関数を定義$inputして引数として渡し$#、空白で区切られた引数の要素数を返します。区切り文字を変更するには、IFS(特殊変数) を変更します。

于 2015-05-08T15:52:03.203 に答える
4
echo "$input" | awk '{print NF}'
于 2015-10-21T09:48:39.110 に答える
0

@dogbane のように、効率的な外部コマンド フリーの方法です。しかし、星では正しく動作します。

$ input="Count from *"
$ IFS=" " read -r -a words <<< "${input}"
$ echo ${#words[@]}
3

If input="Count from *"thenwords=( $input )はグロブ展開を呼び出します。したがって、words 配列のサイズは、現在のディレクトリ内のファイルの数によって異なります。IFS=" " read -r -a words <<< "${input}"そのため、代わりにそれを使用します。

https://github.com/koalaman/shellcheck/wiki/SC2206を参照

于 2021-06-07T11:40:10.857 に答える