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

Yog*_*hat 35 bash

我想使用Shell计算String中的单词数.

假设String是:

input="Count from this String"
Run Code Online (Sandbox Code Playgroud)

这里的分隔符是空格' ',预期输出是4.输入字符串中也可以有尾随空格字符"Count from this String ".

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

Tux*_*ude 50

echo "$input" | wc -w
Run Code Online (Sandbox Code Playgroud)

使用wc -w计算单词数.

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

wc -w <<< "$input"
Run Code Online (Sandbox Code Playgroud)

如果您的shell不支持<<<,您可以尝试以下变体:

wc -w << END_OF_INPUT
$input
END_OF_INPUT
Run Code Online (Sandbox Code Playgroud)

  • 这是[无用的回声](http://fahdshariff.blogspot.com/2012/12/useless-use-of-echo.html).使用`wc -w <<<"$ input"`代替. (10认同)
  • @dogbane,是的,虽然只有你使用bash.在标准POSIX shell中,`echo`是执行此操作的单行方式. (3认同)

dog*_*ane 39

您不需要外部命令,wc因为您可以使用bash更高效的纯函数.

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

$ input="Count from this String   "
$ words=( $input )
$ echo ${#words[@]}
4
Run Code Online (Sandbox Code Playgroud)

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

$ input="Count from this String   "
$ set -- $input
$ echo $#
4
Run Code Online (Sandbox Code Playgroud)

  • 第二种变体具有副作用,它会覆盖位置参数,例如从命令行接收的任何参数或传递给函数的参数(如果这些行在函数内).因此在使用set-$ input之后,请确保不要依赖$ 1,$ 2等 (4认同)

qne*_*ill 7

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

$ input="Count from this string "
$ echo $(IFS=' '; set -f; set -- $input; echo $#)
4
Run Code Online (Sandbox Code Playgroud)

它也适用于其他分隔符:

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

注意使用"set -f"来禁用子shell中的bash文件名扩展,所以如果调用者想要扩展它应该事先完成(Hat Tip @ mkelement0).

  • 做得很好; 我建议在每个`set`命令前加上`set -f;`(注意:必须是_separate_命令),以便(暂时)禁用路径名扩展.这确保了诸如`*`之类的输入令牌不会被意外扩展. (2认同)

小智 6

echo "$input" | awk '{print NF}'
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 5

尝试以下单行:

echo $(c() { echo $#; }; c $input)
Run Code Online (Sandbox Code Playgroud)

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