我想使用 Shell 计算字符串中的单词数。
假设字符串是:
input="Count from this String"
这里的分隔符是空格' '
,预期输出是 4。输入字符串中也可以有尾随空格字符,例如"Count from this String "
.
如果字符串中有尾随空格,它应该产生相同的输出,即 4。我该怎么做?
我想使用 Shell 计算字符串中的单词数。
假设字符串是:
input="Count from this String"
这里的分隔符是空格' '
,预期输出是 4。输入字符串中也可以有尾随空格字符,例如"Count from this String "
.
如果字符串中有尾随空格,它应该产生相同的输出,即 4。我该怎么做?
echo "$input" | wc -w
使用 wc -w 计算单词的数量。
或者按照 dogbane 的建议,也可以消除回声:
wc -w <<< "$input"
如果你的 shell 不支持 <<< 你可以试试这个变体:
wc -w << END_OF_INPUT
$input
END_OF_INPUT
您不需要像这样的外部命令,wc
因为您可以以bash
更有效的方式执行它。
将字符串转换为数组,然后对数组中的元素进行计数:
$ input="Count from this String "
$ words=( $input )
$ echo ${#words[@]}
4
或者,使用set
设置位置参数,然后计算它们:
$ input="Count from this String "
$ set -- $input
$ echo $#
4
要在纯 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)。
尝试以下单线:
echo $(c() { echo $#; }; c $input)
它基本上定义了c()
函数并作为参数传递$input
,然后$#
返回参数中由空格分隔的元素数。要更改分隔符,您可以更改IFS
(特殊变量)。
echo "$input" | awk '{print NF}'
我将使用 perl 单行代码(避免“无用使用 echo”):
perl -lane 'print scalar(@F)' <<< $input
它是高效的外部命令免费方式,如@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}"
改用它。
function count_item() {
return $#
}
input="one two three"
count_item $input
n=$?
echo $n
注意:函数参数传递将空格视为分隔参数,因此 $# 有效。美元?是最近调用函数的返回值。