如何使用正则表达式和 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
(这里可能是换行而不是空格)
我只需要分支名称(并且只需要一次)-master
、branch-2.0
或 branch-1.0
。我知道可以使用sed
命令来完成,但我不知道怎么做。
我使用以下正则表达式:(branch-[0-9].[0-9])|(master)
【问题讨论】:
我使用以下正则表达式::编写完整的 sed 命令,而不是仅仅提及您正在使用的内容。此外,写下您从 sed 命令中获得的输出。 Simpygit 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和正则表达式提取子字符串)