2012-02-13 2 views
5

Я написал сценарий, который обновляет версию в определенном файле. Мне нужно проверить, что вход для пользователя в формате версии, поэтому я не заканчиваю добавление числа, которое не нужно в этих важных файлах. То, как я это сделал, - это добавить новое значение version_check, где я удаляю шаблон regex, а затем проверку if.Как проверить строку ввода в bash в формате версии (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 

Это прекрасно работает для XX.XX и xx.xx.xx, но она также позволяет XX.XX.XX.XX и XX.XX.XX.XX.XX и т.д .. так что если пользователь делает ошибку он будет вводить неверные данные в файл. Как я могу заставить регулярное выражение sed ТОЛЬКО разрешать 3 пары чисел, разделенных точкой?

ответ

4

Измените регулярное выражение из:

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

к этому:

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

Sweet! это работает, спасибо огромное – Llanos

+0

Добро пожаловать. Не забудьте принять ответ, чтобы закрыть это Q & A :) – anubhava

0

Вы можете сделать это с Башем 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 

Если вам нужна каждая группа цифр, чтобы быть ровно 2 цифры:

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

Спасибо, но вышеупомянутое изменение сделало это, приветствует в любом случае – Llanos

Смежные вопросы