Bash脚本正则表达式

时间:2011-08-23 10:14:15

标签: regex bash unix

我正在尝试匹配格式为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 个答案:

答案 0 :(得分:11)

首先,您可以放弃echo - expr在任何情况下将其结果打印到stdout。

其次,你的正则表达式需要括号(否则它会打印匹配的字符数,而不是匹配本身),它需要以.*开头。

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.

答案 1 :(得分:7)

根据你的bash版本,不需要调用expr:

$ [[ "abc ABC12 123 3.4 def" =~ [0-9][.][0-9] ]] && echo ${BASH_REMATCH[0]}
3.4

答案 2 :(得分:3)

在盒子外思考:如果您要查找的是在脚本中确定操作系统版本,只需使用uname -runame -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

答案 3 :(得分:3)

在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

答案 4 :(得分:2)

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