14

How do I count the number of dots in a string in BASH? For example

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

# Variable VAR contains 5 dots
4

6 回答 6

17

您可以结合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 "\."
于 2012-08-14T13:32:23.310 回答
7

awk选择:

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

输出:

5
于 2012-08-15T10:31:30.457 回答
7
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

于 2012-08-14T13:23:43.443 回答
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}
于 2012-08-14T13:45:20.397 回答
2

临时设置IFS,纯Bash,无子进程:

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

输出:

5
于 2012-10-20T23:55:28.633 回答
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 中的位置参数数量中减去 1 并回显要在dot_count.

于 2012-08-14T14:06:21.933 回答