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

Posted

技术标签:

【中文标题】如何使用正则表达式和 sed 提取分支名称?【英文标题】:How to extract branch name using regex and sed? 【发布时间】:2022-01-06 06:42:23 【问题描述】:

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

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

这可能会返回:

    * branch-1.0(前缀始终是星号)

    branch-2.0 remotes/origin/branch-2.0(这里可能是换行而不是空格)

    master remotes/origin/master (这里可能是换行而不是空格)

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

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

【问题讨论】:

我使用以下正则表达式::编写完整的 sed 命令,而不是仅仅提及您正在使用的内容。此外,写下您从 sed 命令中获得的输出。 Simpy git branch -a | cut -c2- 丢弃前两列。 你可以做git branch -a --format='%(refname:short)' --contains=$sha 【参考方案1】:

这就是在 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"

编辑

因为Philippe mentionned--format='%(refname:short)会直接返回没有路径的分支名,从而省去了进一步处理从完整引用路径中提取的需要。

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

【讨论】:

【参考方案2】:

使用sed

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

使用awk

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

【讨论】:

对不起,我还不能投票)当我有足够的声望时,我会投票给你的答案。感谢您的帮助!

以上是关于如何使用正则表达式和 sed 提取分支名称?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:使用 SED 从 XML 中提取 IP 和 IPv6 [重复]

regular expression (如何用Sed和正则表达式提取子字符串)

sed配合正则表达式应用

使用awk / grep / sed / bash / vim进行正则表达式匹配和打印

sed中的非贪婪(不情愿)正则表达式匹配?

如何使用 sed、awk 或 gawk 仅打印匹配的内容?