如何使用正则表达式和 sed 提取分支名称?

How to extract branch name using regex and sed?

如何使用 bash 从字符串中提取分支名称?例如,我有以下命令:

branch=$(git branch -a --contains $sha)

这可能 return:

  1. * branch-1.0(前缀总是星号)

  2. branch-2.0 remotes/origin/branch-2.0(这里可能换行而不是space)

  3. master remotes/origin/master (这里可能换行而不是 space)

我只需要分支名称(而且只需要一次)- masterbranch-2.0branch-1.0。我知道可以用 sed 命令来完成,但我不知道怎么做。

我使用以下正则表达式:(branch-[0-9].[0-9])|(master)

这是在 Bash 中无需使用外部正则表达式解析器即可完成的方法:

# Read reference name path in an array splitting entries by /
IFS=/ read -ra refname < <(
  # Obtain full branch reference path that contains this sha
  git branch --format='%(refname)' --contains="$sha"
)

# Branch name is the last array element
branchname="${refname[-1]}"

printf 'The git branch name for sha: %s\nis: %s\n' "$sha" "$branchname"

或仅使用 POSIX-shell 语法:

# Read reference path
refname=$(
  # Obtain full branch reference path that contains this sha
  git branch --format='%(refname)' --contains="$sha"
)

# Trim-out all leading path to get only the branch name
branchname="${refname##*/}"

printf 'The git branch name for sha: %s\nis: %s\n' "$sha" "$branchname"

编辑:

因为 --format='%(refname:short) 会直接return 没有路径的分支名称,从而省去了进一步处理从完整参考路径中提取它的需要。

branchname=$(git branch --format='%(refname:short)' --contains="$sha")

使用sed

$ branch=$(git branch -a --contains $sha | sed 's#.*/\|[^a-z]*##')

使用awk

$ branch=$(git branch -a --contains $sha | awk -F/ '{gsub("* ","");print $NF}')