[email protected]:~$ [[ "libSDL_image-1.2.so.0.8.4" =~ ^.*[.]so(([.][0-9]+)+)*$ ]] && echo LIB
LIB
[email protected]:~$ echo ${#BASH_REMATCH[*]}
3
[email protected]:~$ echo ${BASH_REMATCH[1]}
.0.8.4
[email protected]:~$ echo ${BASH_REMATCH[2]}
.4
Можно найти работы и библиотечную версию Regex.Иррациональный шаблон REGEX, соответствующий в Bash
[email protected]:~$ [[ "libSDL_image-1.2.so.0.8.4" =~ ^.*[.]so(([.][0-9]+)+)*$|^lib.+[.]so.* ]] && echo LIB
LIB
[email protected]:~$ echo ${#BASH_REMATCH[*]}
3
[email protected]:~$ echo "'${BASH_REMATCH[1]}'"
''
[email protected]:~$ echo "'${BASH_REMATCH[2]}'"
''
Спички, но версия безвозвратная.
[email protected]:~$ [[ "libSDL_image-1.2.so.0.8.4" =~ ^.*[.]so(([.][0-9]+)+)*$|^lib.+[.]so(.*) ]] && echo LIB
LIB
[email protected]:~$ echo ${#BASH_REMATCH[*]}
4
[email protected]:~$ echo "'${BASH_REMATCH[1]}'"
''
[email protected]:~$ echo "'${BASH_REMATCH[2]}'"
''
[email protected]:~$ echo "'${BASH_REMATCH[3]}'"
'.0.8.4'
Версия теперь доступна только из альтернативного регулярного выражения.
Вопрос в том, почему первое совпадение игнорируется, и есть ли способ сказать, когда альтернатива будет соответствовать последовательности?
Это работает, как вы, кажется, рассчитывать на меня в Баш 3.2.48 (на OS X), но не 4.2.37 (на Debian). – Barmar
работает в osx в '4.3.42 (1) -release (x86_64-apple-darwin15.0.0)' (macports) также в '4.3.33 (0) -release (amd64-portbld-freebsd9.0)'. – jm666
OT: Я не понимаю '*' in '(([.] [0-9] +) +) *'. То, к чему это относится, уже повторяется, поэтому все, что '*' делает, делает его необязательным. Но тогда вы могли бы просто использовать необязательный повтор в первую очередь: '(([.] [0-9] +) *)'. Я не думаю, что это влияет на то, как чередование сопоставляется (хотя вы никогда не знаете), но всегда полезно избегать бессмысленных операторов повторения. – rici