计算字符串中的点数

时间:2012-08-14 13:19:58

标签: bash

如何计算BASH中字符串中的点数?例如

VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"

# Variable VAR contains 5 dots

6 个答案:

答案 0 :(得分:16)

您可以将grepwc命令结合使用:

echo "string.with.dots." | grep -o "\." | wc -l

说明:

grep -o   # will return only matching symbols line/by/line
wc -l     # will count number of lines produced by grep

或者您只能将grep用于此目的:

echo "string.with.dots." | grep -o "\." | grep -c "\."

答案 1 :(得分:6)

bash的解决方案:

VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd" 
VAR_TMP="${VAR//\.}" ; echo $((${#VAR} - ${#VAR_TMP}))

或甚至像chepner提到的那样:

VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd" 
VAR_TMP="${VAR//[^.]}" ; echo ${#VAR_TMP}

答案 2 :(得分:6)

awk替代方案:

echo "$VAR" | awk -F. '{ print NF - 1 }'

输出:

5

答案 3 :(得分:5)

VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
echo $VAR | tr -d -c '.' | wc -c

tr -d从输入中删除给定的字符。 -c采用给定字符的倒数。这个表达式一起删除了非''字符并使用wc计算结果长度。

答案 4 :(得分:2)

暂时设置IFS,纯Bash,没有子流程:

IFS=. VARTMP=(X${VAR}X) # avoid stripping dots
echo $(( ${#VARTMP[@]} - 1 ))

输出:

5

答案 5 :(得分:1)

VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
dot_count=$( IFS=.; set $VAR; echo $(( $# - 1 )) )

这可以通过将字段分隔符设置为“。”来实现。在子shell中并通过对字符串进行分词来设置位置参数。对于N点,将存在N + 1个位置参数。我们通过从子shell中的位置参数数量中减去一个并回显要在dot_count中捕获的内容来完成。