我正在尝试匹配格式为4.6或2.8的字符串中的版本号。我有以下内容,我最终将在.bashrc文件中的函数中使用以查找操作系统版本:
function test () {
string="abc ABC12 123 3.4 def";
echo `expr match "$string" '[0-9][.][0-9]'`
}
但是,这与字符串中的3.4不匹配。谁能指出我在这方面的正确方向?
感谢。
答案 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 -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
答案 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]'