Как извлечь имя ветки, используя регулярное выражение и sed?

Как я могу извлечь имя ветки из строки с помощью bash? Например, у меня есть следующая команда:

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

Это может вернуть:

  1. * branch-1.0(префикс всегда звездочка)

  2. branch-2.0 remotes/origin/branch-2.0(здесь может быть новая строка вместо пробела)

  3. 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")
Другие вопросы по тегам