如何使用shell计算String中的单词数

时间:2013-02-27 09:17:16

标签: bash

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

假设字符串是:

input="Count from this String"

此处分隔符为空格' ',预期输出为4。 输入字符串中也可能有尾随空格字符,如"Count from this String "

如果String中有尾随空格,它应该产生相同的输出,即4.我该怎么做?

7 个答案:

答案 0 :(得分:45)

echo "$input" | wc -w

使用wc -w计算单词数。

或者根据dogbane的建议,回声也可以摆脱:

wc -w <<< "$input"

如果&lt;&lt;&lt;您的shell不支持您可以尝试此变体:

wc -w << END_OF_INPUT
$input
END_OF_INPUT

答案 1 :(得分:38)

您不需要像wc这样的外部命令,因为您可以使用更高效的纯bash来执行此操作。

将字符串转换为数组,然后计算数组中的元素:

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

或者,使用set设置位置参数,然后计算它们:

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

答案 2 :(得分:7)

要在纯粹的bash中避免副作用,请在子shell中执行:

$ 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

请注意使用“set -f”在子shell中禁用bash filename expansion,因此如果调用者想要扩展,则应事先完成(Hat Tip @ mkelement0)。

答案 3 :(得分:5)

尝试以下单行:

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

它基本上定义c()函数并传递$input作为参数,然后$#返回由空格分隔的参数中的元素数。要更改分隔符,您可以更改IFS(特殊变量)。

答案 4 :(得分:3)

echo "$input" | awk '{print NF}'

答案 5 :(得分:0)

我只需要使用perl单行程(请避免“无用地使用echo”):

perl -lane 'print scalar(@F)' <<< $input

答案 6 :(得分:0)

这是一种高效的无外部命令方式,就像@dogbane 一样。但它适用于星星。

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

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

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