2012-08-14 19 views
11

¿Cómo cuento el número de puntos en una cadena en BASH? Por ejemploContando el número de puntos en una cadena

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

# Variable VAR contains 5 dots 
+0

Posible duplicado de [contar ocurrencias de char en cadena usando bash] (http://stackoverflow.com/questions/16679369/count-occurrences-of-char-in-string-using-bash) –

Respuesta

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 borra dado caracteres de la entrada. -c toma el inverso de los caracteres dados. en conjunto, esta expresión elimina no '.' caracteres y cuenta la longitud resultante usando wc.

12

Puede hacerlo combinando grep y wc comandos:

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

Explicación:

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

O única grep puede utilizar para tal fin:

echo "string.with.dots." | grep -o "\." | grep -c "\." 
6

Solución en pura bash:

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

o incluso sólo como chepner mencionó:

VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd" 
VAR_TMP="${VAR//[^.]}" ; echo ${#VAR_TMP} 
+5

O 'DOTS = $ {VAR_TMP // [^.]}; echo $ {# DOTS} '. – chepner

1
VAR="s454-da4_sd.fs_84-df.f-sds.a_as_d.a-565sd.dasd" 
dot_count=$(IFS=.; set $VAR; echo $(($# - 1))) 

Esto funciona ajustando el separador de campo a "" en una subshell y estableciendo los parámetros posicionales dividiendo las palabras de la cadena. Con N puntos, habrá N + 1 parámetros posicionales. Terminamos restando uno del número de parámetros posicionales en la subcadena y haciendo eco de eso para ser capturado en dot_count.

+0

Esto quitará los puntos iniciales y finales. – nneonneo

6

awk alternativa:

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

Salida:

5 
2

establecer temporalmente IFS, Bash pura, no hay subprocesos:

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

Salida:

5 
Cuestiones relacionadas