如何通过命令替换在一个命令中使用字符串替换?

如何通过命令替换在一个命令中使用字符串替换?

git branch命令执行时,通常会显示:

* main 
.... # other branches

通过以下内容命令替换字符串替换按预期工作:

current_branch=$(git branch | head -n1)     #1
current_branch="${current_branch/* /}"      #2  
echo "current_branch: '${current_branch}'"

仅打印main

问题

如何将(如果可能)第 1 行和第 2 行合并为一?

current_branch=$(git branch | head -n1 | XXX)

应该是什么XXX

答案1

您无法通过参数扩展来做到这一点。毕竟,参数扩展适用于参数

你不会总是把“主要”作为第一的显示分支。我建议

git branch | sed -n 's/^[*] //p'

但是,还有另一种方法可以获取当前分支(HEAD 提交的分支),而无需处理输出。

git rev-parse --abbrev-ref HEAD

答案2

扩展"${current_branch/* /}"返回 的值,current_branch删除最后一个空格之前的所有内容。它与 相同"${var##* }"。如果需要,您可以在sed(对于每一行,对于来自 stdin 的输入):执行相同的操作sed -e 's/.* //'。在这里,这样做可能是有意义的,因为您已经有一个设置变量值的命令替换,并且您可以将其添加sed到管道中。

实际上,您也可以使用sed替换head

current_branch=$(git branch | sed -e 's/.* //'  -e 1q)

另一方面,您可以使用 shell 的参数扩展来完成这两项操作:

current_branch=$(git branch)
current_branch=${current_branch%%$'\n'*}    # remove from first NL
current_branch=${current_branch##* }        # remove to last SP

在 zsh 中,您可以级联扩展,例如

current_branch=${"$(git branch | head -n1)"/* /}

但这在 Bash 中不起作用。

相关内容