我想使用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)
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)
要在纯粹的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).
尝试以下单行:
echo $(c() { echo $#; }; c $input)
Run Code Online (Sandbox Code Playgroud)
它基本上定义了c()函数并$input作为参数传递,然后$#返回由空格分隔的参数中的元素数.要更改分隔符,您可以更改IFS(特殊变量).
| 归档时间: |
|
| 查看次数: |
72160 次 |
| 最近记录: |