【问题标题】:How to extract branch name using regex and sed?如何使用正则表达式和 sed 提取分支名称?
【发布时间】:2022-01-06 06:42:23
【问题描述】:

如何使用 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 (这里可能是换行而不是空格)

我只需要分支名称(并且只需要一次)-masterbranch-2.0branch-1.0。我知道可以使用sed 命令来完成,但我不知道怎么做。

我使用以下正则表达式:(branch-[0-9].[0-9])|(master)

【问题讨论】:

  • 我使用以下正则表达式::编写完整的 sed 命令,而不是仅仅提及您正在使用的内容。此外,写下您从 sed 命令中获得的输出。
  • Simpy git branch -a | cut -c2- 丢弃前两列。
  • 你可以做git branch -a --format='%(refname:short)' --contains=$sha

标签: regex bash sed unix-text-processing text-capture


【解决方案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}')
    

    【讨论】:

    • 对不起,我还不能投票)当我有足够的声望时,我会投票给你的答案。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2013-06-03
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多