2010-02-02 16 views

Odpowiedz

6

To będzie robić to, co chcesz:

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

dzięki dokładnie to, co chcę;) – soField

+0

nie wiedział o tym tr -c użycia, ładny –

+0

faktycznie tr -cd wykonuje to zadanie dobrze :) – soField

1

Isolate przecinki na linię, liczą linie:

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

Off szczycie mojej głowy przy użyciu czystego bash:

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

Zmień drugi wiersz na: 'temp = $ {var // [^,] /}' następnie usuwa każdy nie-przecinek. –

+0

Dobra rozmowa, dziękuję za przypomnienie. – SiegeX

0

Rozwiązanie czysto bash bez programów zewnętrznych:

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

Uwaga: To niszczy parametry pozycyjne.

+0

Eval i pojedyncze cytaty są niepotrzebne. –

+0

@Dennis: Ok. Pozbyłem się ich. – camh

0

Innym czystego roztworu atakujących:

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

wyjściowy natomiast "10" w ciągu pokazane.

+0

Nie działa z 'var =" 1,2,3 "' (wydaje się działać tylko wtedy, gdy istnieje przecinek końcowy). –

+0

@Alok: Dzięki za wskazanie tego. Zostało to naprawione. Jednak bardziej lubię ** wersję SiegeX ** **. –

0

bardzo prosto z awk

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

tylko z muszli

$ s="1,2,3,4" 
$ IFS="," 
$ set -- $s 
$ echo $(($#-1)) 
3 
0
echo '1,2,3' | grep -o ',' | wc -l 
Powiązane problemy