2012-08-14 373 views
11

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

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

# Variable VAR contains 5 dots 
+0

[使用bash在字符串中计数字符数的可能的重复](http://stackoverflow.com/questions/16679369/count-occurrences-of-char-in-string-using-bash) – 2015-11-19 23:16:33

回答

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来计算所得长度。

12

你可以做到这一点结合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 "\." 
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} 
+5

或者'DOTS = $ {VAR_TMP // [^]}; echo $ {#DOTS}'。 – chepner 2012-08-14 14:32:56

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个位置参数。我们通过从子外壳中的位置参数数量中减去1来完成,并回显在dot_count中捕获的数据。

+0

这将去掉前导点和尾点。 – nneonneo 2012-10-20 23:57:46

6

awk替代:

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

输出:

5 
2

暂时设定IFS,纯击,没有子过程:

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

输出:

5