2012-08-14 20 views
11

Jak zliczyć liczbę kropek w łańcuchu w BASH? Na przykładZliczanie liczby kropek w ciągu znaków

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

# Variable VAR contains 5 dots 
+0

Możliwy duplikat [liczba wystąpień znaku w ciągu za pomocą bash] (http://stackoverflow.com/questions/16679369/count-occurrences-of-char-in-string-using-bash) –

Odpowiedz

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 usuwa podane znaki z wejścia. -c przyjmuje odwrotność podanych znaków. razem, to wyrażenie usuwa non "." znaków i zlicza uzyskaną długość za pomocą wc.

12

Można to zrobić łącząc grep i wc polecenia:

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

Objaśnienie:

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

Albo można użyć tylko grep do tego celu:

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

rozwiązaniem w czystej bash:

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

lub nawet tylko jako chepner wymienić:

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

Lub '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))) 

Działa to poprzez ustawienie separator pól na "". w podpowłoce i ustawianie parametrów pozycyjnych poprzez dzielenie wyrazów ciągu znaków. Przy N punktach będą dostępne parametry pozycyjne N + 1. Kończymy odejmując jeden od liczby parametrów pozycyjnych w podpowłoce i powtarzając, że ma zostać przechwycony w dot_count.

+0

Spowoduje to usunięcie początkowych i końcowych kropek. – nneonneo

6

awk alternatywnie:

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

wyjściowa:

5 
2

tymczasowo ustawienie IFS, czystą Basha, NO podprocesów:

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

wyjściowa:

5 
Powiązane problemy