如何使用正则表达式和 sed 提取分支名称?
How to extract branch name using regex and sed?
如何使用 bash 从字符串中提取分支名称?例如,我有以下命令:
branch=$(git branch -a --contains $sha)
这可能 return:
* branch-1.0
(前缀总是星号)
branch-2.0 remotes/origin/branch-2.0
(这里可能换行而不是space)
master remotes/origin/master
(这里可能换行而不是 space)
我只需要分支名称(而且只需要一次)- master
、branch-2.0
或 branch-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}')
如何使用 bash 从字符串中提取分支名称?例如,我有以下命令:
branch=$(git branch -a --contains $sha)
这可能 return:
* branch-1.0
(前缀总是星号)branch-2.0 remotes/origin/branch-2.0
(这里可能换行而不是space)master remotes/origin/master
(这里可能换行而不是 space)
我只需要分支名称(而且只需要一次)- master
、branch-2.0
或 branch-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}')