Bash正则表达式在Ubuntu上匹配,但在macOS

时间:2018-06-16 03:54:05

标签: regex bash

我有以下bash脚本:

#!/bin/bash

git_status="$(git status 2>/dev/null)"
branch_pattern="^(# |)On branch ([^${IFS}]*)"
echo $git_status
echo $branch_pattern

if [[ ${git_status} =~ ${branch_pattern} ]]; then
    echo 'hello'
    echo $BASH_REMATCH
fi

以下是使用bash版本4在Ubuntu上运行脚本时的输出:

On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) test.sh nothing added to commit but untracked files present (use "git add" to track)
^(# |)On branch ([^ ]*)
hello
On branch master

但是,当我使用bash版本3在macOS上运行相同的脚本时,正则表达式不匹配,并且if块内没有任何内容被执行。其余的输出是相同的。我错过了什么?在这个版本的bash中,我的正则表达式是否需要在macOS /上进行不同的格式化?有没有我失踪的旗帜?

我已经看过类似帖子,关于跨平台的正则表达式行为的差异,例如find命令,但我还没有找到与我的问题相关的帖子。

2 个答案:

答案 0 :(得分:1)

如果您只是想获取当前的git分支名称,则不需要正则表达式。 Git已经内置了这个。

git rev-parse --abbrev-ref HEAD 2>/dev/null

这将打印出当前的分支名称(如果有的话) 如果您在没有任何提交的git存储库中,它将只返回&#34; HEAD&#34;

答案 1 :(得分:1)

在我看来,在macOS附带的bash版本的RE引擎中存在一个错误(它相当陈旧 - 3.2.57)。它与^部分有关 - 它似乎与字符串开头的空字符串不匹配,因为它应该如此。但我找到了一个解决方法。显然,如果branch_pattern="(^# |^)On branch ([^${IFS}]*)" 在括号内,则不会发生错误,如下所示:

echo $varname

顺便说一句,你不应该使用printf '<<%q>>\n' "$varname"来打印变量的内容。首先,它会进行单词拆分(将所有空白空间转换为单个空格)和值上的通配符扩展,这可能非常混乱/误导。尝试使用类似create的内容。如果变量包含奇怪的字符,它的输出可能有点神秘,但至少它会清楚地表明那里有 奇怪的东西。