如何在 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
有几个问题:
- bash 不支持
\d
。使用 [0-9]
.
- 运算符周围需要空格:
$TAGS =~ $re
,否则 bash 将其解析为 [[ -n "$TAGS=~$re" ]]
。
- shell 的路径是
/bin/bash
,而不是 bin/bash
。
更新,基于 OP 对环境的澄清和他自己的发现:
tl;dr:
- msysgit(从版本 1.9.5 开始)附带一个 bash 可执行文件,编译时不支持
=~
,正则表达式匹配运算符
- 有限的解决方法 是改用
grep
、sed
和 awk
等实用程序。
- 要从根本上解决这个问题,安装一个单独的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.exe
、sh.exe
、msys-termcap-0.dll
- 换句话说:完全替换 msysgit 的 bash。
[编者注: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
有几个问题:
- bash 不支持
\d
。使用[0-9]
. - 运算符周围需要空格:
$TAGS =~ $re
,否则 bash 将其解析为[[ -n "$TAGS=~$re" ]]
。 - shell 的路径是
/bin/bash
,而不是bin/bash
。
更新,基于 OP 对环境的澄清和他自己的发现:
tl;dr:
- msysgit(从版本 1.9.5 开始)附带一个 bash 可执行文件,编译时不支持
=~
,正则表达式匹配运算符 - 有限的解决方法 是改用
grep
、sed
和awk
等实用程序。 - 要从根本上解决这个问题,安装一个单独的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.exe
、sh.exe
、msys-termcap-0.dll
- 换句话说:完全替换 msysgit 的 bash。