如何计算BASH中字符串中的点数?例如
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
# Variable VAR contains 5 dots
答案 0 :(得分:16)
您可以将grep
和wc
命令结合使用:
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
中捕获的内容来完成。