シェルを使用して文字列から単語数を数えたい。
文字列が次のようになっているとします。
input="Count from this String"
ここで、区切り文字はスペース' '
であり、期待される出力は4です。入力文字列に。のような末尾のスペース文字が含まれる場合もあります"Count from this String "
。
文字列に末尾のスペースがある場合、同じ出力、つまり4が生成されるはずです。これを行うにはどうすればよいですか?
シェルを使用して文字列から単語数を数えたい。
文字列が次のようになっているとします。
input="Count from this String"
ここで、区切り文字はスペース' '
であり、期待される出力は4です。入力文字列に。のような末尾のスペース文字が含まれる場合もあります"Count from this String "
。
文字列に末尾のスペースがある場合、同じ出力、つまり4が生成されるはずです。これを行うにはどうすればよいですか?
echo "$input" | wc -w
wc -wを使用して、単語数をカウントします。
または、dogbaneの提案に従って、エコーも取り除くことができます。
wc -w <<< "$input"
<<<がシェルでサポートされていない場合は、次のバリアントを試すことができます。
wc -w << END_OF_INPUT
$input
END_OF_INPUT
より効率的wc
なピュアで実行できるため、のような外部コマンドは必要ありません。bash
文字列を配列に変換してから、配列内の要素を数えます。
$ input="Count from this String "
$ words=( $input )
$ echo ${#words[@]}
4
または、 を使用set
して位置パラメーターを設定し、それらをカウントします。
$ input="Count from this String "
$ set -- $input
$ echo $#
4
副作用を避けて純粋な 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)。
次のワンライナーを試してください。
echo $(c() { echo $#; }; c $input)
c()
基本的に関数を定義$input
して引数として渡し$#
、空白で区切られた引数の要素数を返します。区切り文字を変更するには、IFS
(特殊変数) を変更します。
echo "$input" | awk '{print NF}'
@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}"
そのため、代わりにそれを使用します。