如何在 Windows 上的 msysgit 中使用 shell 中的正则表达式从字符串中捕获组?

How can I capture group from string using regexp in shell in msysgit on Windows?

[编者注:OP 后来澄清说他 运行 bash 作为 msysgit 的一部分, Git Windows 的版本。]

我正在尝试从字符串中获取最后一位数字。我有一个小脚本,但它不起作用,我不知道为什么:

 #!bin/bash
 TAGS="MASTER_46"
 re="_(\d+)"
 if [[ ${TAGS}=~$re ]]; then 
     echo "Find"
     echo ${BASH_REMATCH} 
     echo ${BASH_REMATCH[1]} 
 fi

输出:

Find
{empty}
{empty}

我正在使用 bash

$ bash --version
  GNU bash, version 3.1.20(4)-release

有几个问题:

  1. bash 不支持 \d。使用 [0-9].
  2. 运算符周围需要空格:$TAGS =~ $re,否则 bash 将其解析为 [[ -n "$TAGS=~$re" ]]
  3. shell 的路径是 /bin/bash,而不是 bin/bash

更新,基于 OP 对环境的澄清和他自己的发现

tl;dr:

  • msysgit(从版本 1.9.5 开始)附带一个 bash 可执行文件,编译时不支持 =~,正则表达式匹配运算符
  • 有限的解决方法 是改用 grepsedawk 等实用程序。
  • 从根本上解决这个问题,安装一个单独的Unix仿真环境,例如MSYS或Cygwin,然后从那里使用git.exe(msysgit的核心)。

有很好的指点,但让我补充一点,因为您收到以下错误消息:

conditional binary operator expected syntax error near =~

言外之意就是

  • 您的 bash 版本太旧 不支持正则表达式匹配运算符 =~
  • 您的 bash 版本 编译时没有正则表达式支持

鉴于 =~ 是在 bash 3.0 中引入的(参见 http://tiswww.case.edu/php/chet/bash/NEWS)并且您是 运行 3.1.x,它必须是 后者,事实证明确实如此:

OP运行msysgit,官方Git版本Windows自带bash和一套Unix 实用程序。

事实证明,从版本 1.9.5 开始,msysgit 附带的 bash 可执行文件构建 不支持正则表达式 ,可能是由于技术困难 - 参见 https://groups.google.com/forum/#!topic/msysgit/yPh85MPDyfE.

令人难以置信的是,发行说明的 "Known Issues" 部分并未提及此限制。

你最好的选择是:

  • 安装 MSYS 用作您的 Unix 仿真环境 - 它的 bash =~ 支持(注意 msysgit 最初是从 MSYS 派生出来的)。
    • 或者,要以更大的安装占用空间和可能的性能为代价获得更好的 Unix 仿真和更多工具,请安装 Cygwin
  • 在 MSYS 中,仅使用来自 msysgit 的 git.exe,通过 Windows %PATH%
    • 为此,请务必使用 Run Git from the Windows Command Prompt 选项安装 msysgit - 请参阅
    • 或者,手动添加 C:\Program Files\Git\cmd(假设 32 位 Windows 上的默认路径,64 位 Windows 上的默认路径是 C:\Program Files (x86)\Git\cmd)到您的 Windows %PATH%,或在您的 MSYS ~/.profile 文件中扩展 $PATH(例如,PATH="$PATH:/c/program files/git/cmd")。

您可以 破解 您的 msysgit 安装,但这似乎不值得,而且我不知道副作用是什么; 如果您真的想尝试,请执行以下操作:将以下文件从 MSYS 安装的 bin 目录复制到 msysgit 的 bin 目录:bash.exesh.exemsys-termcap-0.dll - 换句话说:完全替换 msysgit 的 bash。