【问题标题】:Bash scripting regular expressionsBash 脚本正则表达式
【发布时间】:2011-11-01 19:59:17
【问题描述】:

我正在尝试从格式为 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-9]\.[0-9]
  • [.] 不是单个字符吗?您的功能是否完全匹配?我不知道 bash 中正则表达式的细节,但我认为匹配会类似于“2 1”。
  • @oliver:如果在括号内,则不按原样使用
  • 你确定你明白应该发生什么吗?在我看来,expr match STRING REGEX 如果匹配则返回 0,否则返回非零。这就是您的示例在我的机器上发生的情况。
  • 我使用 expr match "$string" '.*([0-9][.][0-9]*)' 让它工作,这样它成功打印了 xx 号。跨度>

标签: regex bash unix


【解决方案1】:
expr match "$string" '.*[0-9][.][0-9]'

【讨论】:

  • 不知道 bash 部分,但只有正则表达式会匹配所有内容,直到(包括)3.4
  • 没有括号,这也只是打印字符数
【解决方案2】:

跳出框框思考:如果您要在脚本中确定操作系统版本,只需使用uname -r 或uname -v(它是POSIX)。使用正则表达式可能会出现问题,因为每个操作系统可能有不同的方式来表达其版本。操作系统供应商在发明版本向前和向后跳转方面非常有创意,有些里面有字母,甚至罗马数字也不是闻所未闻(想想 System V)。

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

我在我的 .profile 中使用了这样的 sn-p:

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】:

    首先,您可以删除echo - expr 在任何情况下都将其结果打印到标准输出。

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

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

    来自info expr 页面:

    字符串:正则表达式'

     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.
    

    【讨论】:

      【解决方案4】:

      在 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
      

      【讨论】:

        【解决方案5】:

        根据您的 bash 版本,无需调用 expr:

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

        【讨论】:

          猜你喜欢
          • 2011-10-17
          • 2013-06-06
          • 2019-09-15
          • 2011-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多