15

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
Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985
Charlie
  • 2,061
  • 4
  • 21
  • 21

6 Answers6

18

You can do it combining grep and wc commands:

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

Explanation:

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

Or you can use only grep for that purpose:

echo "string.with.dots." | grep -o "\." | grep -c "\."
Rostyslav Dzinko
  • 39,424
  • 5
  • 49
  • 62
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 deletes given characters from the input. -c takes the inverse of given characters. together, this expression deletes non '.' characters and counts the resulting length using wc.

perreal
  • 94,503
  • 21
  • 155
  • 181
7

awk alternative:

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

Output:

5
Thor
  • 45,082
  • 11
  • 119
  • 130
6

Solution in pure bash :

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

or even just as chepner mentioned:

VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd" 
VAR_TMP="${VAR//[^.]}" ; echo ${#VAR_TMP}
rush
  • 2,484
  • 2
  • 19
  • 31
2

Temporarily setting IFS, pure Bash, no sub-processes:

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

Output:

5
Thor
  • 45,082
  • 11
  • 119
  • 130
nneonneo
  • 171,345
  • 36
  • 312
  • 383
1
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd"
dot_count=$( IFS=.; set $VAR; echo $(( $# - 1 )) )

This works by setting the field separator to "." in a subshell and setting the positional parameters by word-splitting the string. With N dots, there will be N+1 positional parameters. We finish by subtracting one from the number of positional parameters in the subshell and echoing that to be captured in dot_count.

chepner
  • 497,756
  • 71
  • 530
  • 681