2014-06-20 18 views
7

mam następujące:bash regex dopasować semantycznej numer wersji

versionNumber=$(sw_vers -productVersion) # Finds version number 

versionShort=${versionNumber:0:4} # Cut string to 1 decimal place for calculation 

który działa, gdy wersje są tak:

10.9.2 
10.9.5 

ale to nie będzie pasował

10.10.3 

jako wróci tylko

10.1 

ale chcę versionShort być ustawiony na

10.10 

Ja chce dopasować wersję główną, pierwszą kropkę i mniejszą wersję jak wyżej.

Odpowiedz

10

Regexpless rozwiązanie - odcięta ostatnia kropka i co po nim następuje:

versionShort=${versionNumber%.*} 
2

Regexp rozwiązanie:

[[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]] && echo "${BASH_REMATCH[0]}" 

Zawsze będzie drukować pierwsze dwie liczby, na przykład te wszystkie:

10.5 
10.5.9 
10.5.8.2 

Otrzyma wynik 10.5. Możesz także dodać klauzulę else, aby sprawdzić, czy coś się nie stało (nie znaleziono pasującego elementu).

Oto dłuższa wersja:

if [[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]]; then 
    versionShort=${BASH_REMATCH[0]} 
else 
    echo "Something is wrong with your version" >&2 
fi 
+0

jak czy zwracam wynik do zmiennej? – lukemh

+0

to nie działa dla mnie. – lukemh

+0

@lukemh Dodałem dłuższą wersję, która może być dla ciebie bardziej przejrzysta. Jeśli to nie działa ... czy na pewno używasz bash? Jeśli tak, to która wersja? W wersji 3 musisz umieścić prawą stronę wyrażenia warunkowego w zmiennej. –

4

miałem podobne pytanie, ale potrzebne dostęp do wszystkich 3 segmentach. Zrobiłem trochę badań i testów i znalazłem to, aby dobrze pracować

product_version=$(sw_vers -productVersion) 
semver=(${product_version//./ }) 
major="${semver[0]}" 
minor="${semver[1]}" 
patch="${semver[2]}" 
echo "${major}.${minor}.${patch}" 

Aby odpowiedzieć na to pytanie bezpośrednio, można

product_version=$(sw_vers -productVersion) 
semver=(${product_version//./ }) 
major="${semver[0]}" 
minor="${semver[1]}" 
patch="${semver[2]}" 
versionShort="${major}.${minor}" 

lub użyć mniej zmienne

product_version=$(sw_vers -productVersion) 
semver=(${product_version//./ }) 
versionShort="${semver[0]}.${semver[1]}" 
+1

Jak działa "semver = ($ {product_version //./})? Niestety, otrzymuję semver = "10.11.6 //./" kiedy próbuję tego. –