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
Charlie
  • 1,773
  • 4
  • 19
  • 21

6 Answers6

17

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
  • 38,056
  • 5
  • 48
  • 60
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
  • 90,214
  • 20
  • 145
  • 172
7

awk alternative:

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

Output:

5
Thor
  • 42,211
  • 10
  • 116
  • 125
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,424
  • 2
  • 17
  • 30
2

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

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

Output:

5
Thor
  • 42,211
  • 10
  • 116
  • 125
nneonneo
  • 162,933
  • 34
  • 285
  • 360
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
  • 446,329
  • 63
  • 468
  • 610