Bash: =~与Git Bash 3.1中的模式匹配

3

我基本上想在Windows下的Bash 3.1(Git Bash)中执行以下操作:

#!/bin/bash
#set -x
shopt -s extglob
shopt -s nocasematch

declare file='[Vol 01] - 04 - This message'
declare filesafe="${file}"

declare pattern='\[Vol ([0-9]+)\] - ([0-9]+) -*'
if [[ "${file}" =~ $pattern ]]; then
  echo "regexp: $(printf "%s %-2d %-3d" "${filesafe}" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" ) - - -"
else
        echo "failed: $(printf "%s" "${filesafe}") - - - - -"
fi

=~ 不起作用,因为它在这个版本的Bash中不存在。

注意:该脚本适用于 Gentoo 中的 Bash 4.3.33。

Git和Bash的版本如下:

$ git --version ; bash --version
git version 1.9.5.msysgit.1
GNU bash, version 3.1.23(6)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

我找到的关于Bash 3.1唯一的文档版本为:

这是GNU Bash参考手册的第3.1-beta1版,最后更新于2005年9月5日,适用于Bash Version3.1-beta1

该文件说明了=~可用:

另外还有一个二进制运算符'=~'可用,其优先级与'=='和'!='相同。

我错过了类似使用shopt的某些选项吗?


只是一个小提示,不要将您的模式放在引号内。 - Avinash Raj
@anubhava,理论上应该可以,但是由Git for Windows提供的那个msys bash版本缺少上游可用的其他功能--尝试使用进程替换。 - Charles Duffy
文件是一些文件,例如{{[Vol 02] - 0001 - 卷2第1章}}。 然而,我的问题更多地涉及在Windows下Git Bash中实现=运算符,代码只是一个例子,其中它明显失败(比如“我不认识=,伙计!”)。 - NoDataFound
1个回答

3
您可以简单地使用更新版本的bash: 使用git-for-windows,它将很快替换过时的msysgit。
无需设置: 将PortableGit-2.4.6-5th-release-candidate-64-bit.7z.exe解压到任何您想要的地方,并调用c:\path\to\PortableGit-2.4.6-5th-release-candidate-64-bit\git-bash.exe
您将获得一个2013年的4.3.39 bash(而不是msysgit的旧2005年3.1.20 bash):这是最新的最新的4.3补丁之一,发布于2015年5月。

这已经足够让 =~ 生效了。


有支持的 Windows 版本列表吗?我在工作中被困在 XP 上,虽然这个脚本(以及我的问题)是为家庭使用而设计的,但我现在真的很想切换到 git-for-windows。 - NoDataFound
@NoDataFound XP工作得很好。只需解压缩32位版本即可。https://github.com/git-for-windows/git/releases/download/v2.4.6.windows.1/PortableGit-2.4.6-5th-release-candidate-32-bit.7z.exe - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接