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
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
您可以结合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 "\."
awk
选择:
echo "$VAR" | awk -F. '{ print NF - 1 }'
输出:
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
。
纯解决方案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}
临时设置IFS
,纯Bash,无子进程:
IFS=. VARTMP=(X${VAR}X) # avoid stripping dots
echo $(( ${#VARTMP[@]} - 1 ))
输出:
5
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
.