52

我想使用 Shell 计算字符串中的单词数。

假设字符串是:

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"

如果你的 shell 不支持 <<< 你可以试试这个变体:

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 中避免副作用,请在子 shell 中执行:

$ 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

请注意“set -f”的使用,它会在子 shell 中禁用bash 文件名扩展,因此如果调用者想要扩展它应该事先完成(帽子提示 @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 回答
1

我将使用 perl 单行代码(避免“无用使用 echo”):

perl -lane 'print scalar(@F)' <<< $input
于 2017-07-08T19:32:11.323 回答
0

它是高效的外部命令免费方式,如@dogbane 的。但它适用于星星。

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

如果input="Count from *"thenwords=( $input )将调用 glob 扩展。因此,单词数组的大小将根据当前目录中的文件数而有所不同。所以我们IFS=" " read -r -a words <<< "${input}"改用它。

https://github.com/koalaman/shellcheck/wiki/SC2206

于 2021-06-07T11:40:10.857 回答
0
function count_item() {
   return $#
}
input="one two three"
count_item $input
n=$?
echo $n

注意:函数参数传递将空格视为分隔参数,因此 $# 有效。美元?是最近调用函数的返回值。

于 2022-02-22T11:26:39.553 回答