RegEx с \ d не работает в операторе if-else с [[

Я написал следующий сценарий. Он будет использован в процессе сборки позже. Моя цель - решить, будет ли это предварительный релиз или релиз. Чтобы архивировать это, я сравниваю выпуск $ с RegEx. Если мой RegEx совпадает, это предварительный релиз, если нет, то это релиз.

#/bin/bash
release="1.9.2-alpha1"
echo "$release"
if [[ "$release" =~ \d+\.\d+\.\d+[-]+.* ]];then
echo "Pre"
else
echo "Release"
fi

Но в результате я всегда получаю следующее:

~$ bash releasescript.sh
1.9.2-alpha1
Release

Версия:

Ubuntu 18.04.1 LTS

Я использовал этот редактор , чтобы проверить мой RegEx. Я застрял как минимум на 6 часов, поэтому я был бы очень признателен за помощь.

7
задан 16 May 2019 в 14:08

1 ответ

\d и \w не работают в регулярных выражениях POSIX , вы можете использовать [[:digit:]], хотя

#/bin/bash
release="1.9.2-alpha1"
echo "$release"
LANG=C # This needed only if script will be used in locales where digits not 0-9
if [[ "$release" =~ ^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+-+ ]];then
echo "Pre"
else
echo "Release"
fi

я протестировал этот скрипт, он выводит " Pre "для данного $ release

Посмотрите на свой конструктор регулярных выражений, он работает только с perl-совместимыми и регулярными выражениями javascript, в то время как вам нужен posix или расширенный posix.

Согласно @dessert :

[0-9] является более короткой альтернативой [[:digit:]]. Поскольку начало строки должно совпадать, следует добавить ^, в то время как .* в конце является излишним: ^[0-9]+\.[0-9]+\.[0-9]+-+ - при использовании группы это можно еще сократить до: ^([0-9]+\.){2}[0-9]+-+

0
ответ дан 16 May 2019 в 14:08

Другие вопросы по тегам:

Похожие вопросы: