2012-02-13 9 views
5

Napisałem skrypt, który aktualizuje wersję na pewnym pliku. Muszę sprawdzić, czy dane wejściowe dla użytkownika są w formacie wersji, więc nie kończę dodawania numeru, który nie jest potrzebny w tych ważnych plikach. Sposób, w jaki to zrobiłem, polega na dodaniu nowej wartości version_check, w której usuwam wzór regex, a następnie sprawdzam.Jak sprawdzić ciąg wejściowy w bashu w formacie wersji (n1.n2.n3)

version=$1 
version_checked=$(echo $version | sed -e '/[0-9]\+\.[0-9]\+\.[0-9]/d') 

if [[ -z $version_checked ]]; then 
    echo "$version is the right format" 
else 
    echo "$version_checked is not in the right format, please use XX.XX.XX format (ie: 4.15.3)" 
    exit 
fi 

To działa dobrze dla XX.XX i xx.xx.xx ale pozwala również xx.xx.xx.xx i XX.XX.XX.XX.XX etc .. więc jeśli użytkownik popełni błąd wprowadzi błędne dane do pliku. Jak mogę uzyskać sed regex, aby TYLKO umożliwić 3 pary liczb oddzielone kropką?

Odpowiedz

4

Zmień regex od:

/[0-9]\+\.[0-9]\+\.[0-9]/ 

do tego:

/^[0-9]*\.[0-9]*\.[0-9]*$/ 
+0

Słodka! to działa, dziękuję bardzo – Llanos

+0

Nie ma za co. Nie zapomnij przyjąć odpowiedzi na zamknięcie tego pytania i odpowiedzi :) – anubhava

0

Można to zrobić za pomocą bash pattern matching:

$ for version in 1.2 1.2.3 1.2.3.4; do 
    printf "%s\t" $version 
    [[ $version == +([0-9]).+([0-9]).+([0-9]) ]] && echo y || echo n 
done 

1.2  n 
1.2.3 y 
1.2.3.4 n 

Jeśli potrzebujesz każdej grupy cyfr do dokładnie 2 cyfry:

[[ $version == [0-9][0-9].[0-9][0-9].[0-9][0-9] ]] 
+0

Dzięki glen, ale powyższa zmiana to zrobiła, okrzyki mimo to – Llanos

Powiązane problemy