我想使用Shell计算字符串中的单词数。
假设字符串是:
input="Count from this String"
此处分隔符为空格' '
,预期输出为4。
输入字符串中也可能有尾随空格字符,如"Count from this String "
。
如果String中有尾随空格,它应该产生相同的输出,即4.我该怎么做?
答案 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}"
代替它。