2010-02-02 20 views

risposta

6

questo farà ciò che si vuole:

echo "1,2,3" | tr -cd ',' | wc -c 
+0

grazie esattamente quello che voglio;) – soField

+0

non sapeva che l'utilizzo tr -c, bello –

+0

realtà tr -cd sta facendo bene questo lavoro :) – soField

1

Isolare le virgole per linea, contare:

echo "$VAR"|grep -o ,|wc -l 
1

Fuori della parte superiore della mia testa usando bash pura:

var="1,2,3,4" 
temp=${var//[^,]/} 
echo ${#temp} 
+0

Cambia la seconda riga in: 'temp = $ {var // [^,] /}' poi rimuove qualsiasi non-virgola. –

+0

Buona chiamata, grazie per il promemoria – SiegeX

0

Una soluzione puramente bash senza programmi esterni:

$ X=1,2,3,4 
$ count=$(($(IFS=,; set -- $X; echo $#) - 1)) 
$ echo $count 
3 
$ 

Nota: Questo distrugge i parametri posizionali.

+0

L'eval e apici non sono necessari. –

+0

@Dennis: Ok. Mi sono sbarazzato di loro. – camh

0

Un'altra soluzione Bash pura:

var="bbb,1,2,3,4,a,b,qwerty,,," 
saveIFS="$IFS" 
IFS=',' 
var=($var)x 
IFS="$saveIFS" 
echo $((${#var[@]} - 1)) 

uscita volontà "10" con la stringa indicata.

+0

Non funziona con 'var =" 1,2,3 "' (sembra funzionare solo se esiste una virgola finale). –

+0

@Alok: Grazie per la segnalazione. Ora è risolto. Mi piace la versione ** di ** SiegeX **, comunque. –

0

molto semplice con awk

$ echo 1,2,3,4 | awk -F"," '{print NF-1}' 
3 

con solo il guscio

$ s="1,2,3,4" 
$ IFS="," 
$ set -- $s 
$ echo $(($#-1)) 
3 
0
echo '1,2,3' | grep -o ',' | wc -l 
Problemi correlati