Как извлечь имя ветки, используя регулярное выражение и sed?
Как я могу извлечь имя ветки из строки с помощью 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)
2 ответа
С использованием
sed
$ branch=$(git branch -a --contains $sha | sed 's#.*/\|[^a-z]*##')
С использованием
awk
$ branch=$(git branch -a --contains $sha | awk -F/ '{gsub("* ","");print $NF}')
Вот как это можно сделать в 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:
# 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)
будет напрямую возвращать имя ветки без пути, тем самым избавляя от необходимости дальнейшей обработки для извлечения его из полного пути ссылки.
branchname=$(git branch --format='%(refname:short)' --contains="$sha")