Регулярные выражения скриптов Bash - PullRequest
3 голосов
/ 23 августа 2011

Я пытаюсь сопоставить номер версии из строки в формате 4.6 или 2.8.У меня есть следующее, которое я в конечном итоге буду использовать в функции в моем файле .bashrc, чтобы найти версию ОС:

function test () {
    string="abc ABC12 123 3.4 def";
    echo `expr match "$string" '[0-9][.][0-9]'`
}

Однако это не соответствует 3.4 в строке.Кто-нибудь может указать мне правильное направление здесь?

Спасибо.

Ответы [ 5 ]

11 голосов
/ 23 августа 2011

Во-первых, вы можете сбросить echo - expr печать его результата на стандартный вывод в любом случае.

Во-вторых, вашему регулярному выражению нужны скобки (в противном случае оно печатает количество совпавших символов, а не само совпадение), и оно должно начинаться с .*.

expr match "$string" '.*\([0-9][.][0-9]\)'

Со страницы info expr:

STRING: REGEX '

 Perform pattern matching.  The arguments are converted to strings
 and the second is considered to be a (basic, a la GNU `grep')
 regular expression, with a `^' implicitly prepended.  The first
 argument is then matched against this regular expression.

 If the match succeeds and REGEX uses `\(' and `\)', the `:'
 expression returns the part of STRING that matched the
 subexpression; otherwise, it returns the number of characters
 matched.
7 голосов
/ 23 августа 2011

В зависимости от вашей версии bash, нет необходимости вызывать expr:

$ [[ "abc ABC12 123 3.4 def" =~ [0-9][.][0-9] ]] && echo ${BASH_REMATCH[0]}
3.4
3 голосов
/ 23 августа 2011

В Mac OS X 10.6.8:

# cf. http://tldp.org/LDP/abs/html/refcards.html#AEN22429
string="abc ABC12 123 3.4 def"
expr "$string" : '.*\([0-9].[0-9]\)'    #  3.4
3 голосов
/ 23 августа 2011

Нестандартное мышление: если то, что вы ищете, определяет версию ОС в скрипте, просто используйте uname -r или uname -v (это POSIX).Возможно, возникнут проблемы с регулярным выражением, поскольку у каждой ОС могут быть разные способы выражения своей версии.Производители ОС настолько изобретательны, что изобретают переходы версий вперед и назад, у некоторых есть буквы, и даже римские цифры не являются неслыханными (думаю, System V ).

См. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/uname.html

Я использую в своем .profile фрагмент, подобный этому:

case "`uname -sr`" in
  (*BSD*)     OS=`uname -s`;;
  (SunOS\ 4*) OS=SunOS;;
  (SunOS\ 5*) OS=Solaris;;
  (IRIX\ 5*)  OS=IRIX;;
  (HP*)       OS=HP-UX;;
  (Linux*)    OS=Linux;;
  (CYGWIN*)   OS=Cygwin;;
  (*)         OS=generic
esac
2 голосов
/ 23 августа 2011
expr match "$string" '.*[0-9][.][0-9]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...