How can I extract the branch name from a string using bash? For example, I have the following command:
branch=$(git branch -a --contains $sha)
This may return:
* branch-1.0
(the prefix is always an asterisk)branch-2.0 remotes/origin/branch-2.0
(here may be a new line instead of a space)master remotes/origin/master
(here may be a new line instead of a space)
And I need only the branch name (and only once) - master
, branch-2.0
or branch-1.0
. I know it can be done with the sed
command, but I can't figure out how.
I use the following regex: (branch-[0-9].[0-9])|(master)
CodePudding user response:
This is how it can be done in Bash, without using an external regex parser:
# 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"
Or using a POSIX-shell grammar only:
# 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"
CodePudding user response:
Using sed
$ branch=$(git branch -a --contains $sha | sed 's#.*/\|[^a-z]*##')
Using awk
$ branch=$(git branch -a --contains $sha | awk -F/ '{gsub("* ","");print $NF}')