将git命令管道到sed输出



我试图将输出从git管道到sed,这将返回替换文件中的值。表示分支上最后一次提交的配置。

我不确定如何在bash中使用管道来做到这一点。我想也许是这样的?但是它不起作用(没有输出)

git rev-parse --short HEAD | sed -i 's/"commit".*:.*".*"/"commit": "${$_}"/g' file.config

这是可能的吗,或者我可以采取更好的方法吗?

file.config的内容

{
"commit" : "684e8ba31"
}

文件内容。配置(运行命令后)

{
"commit" : "${$_}"
}

文件内容。配置(预期输出)

{
"commit" : "441d6fc22"
}

git rev-parse——short HEAD

441d6fc22
sed -i '/"commit" *:/s/: *"[^"]*"/: "'$(git rev-parse HEAD)'"/' file.config

可以。您混淆了命令行参数和stdin输入。它们都是提供被调用程序数据的良好且广泛使用的方式,但是容量和时间的差异很重要,因此要花更多的时间研究它们是如何工作的。

模拟git调用的输出:

$ cat git.out
441d6fc22

我们将git输出捕获到一个变量,然后将该变量提供给sed的一个想法:

$ read -r sha < <(cat git.out)
$ sed -E "s/^(.*"commit"[^"]*).*/1"${sha}"/" file.config
{
"commit" : "441d6fc22"
}

地点:

  • -E-启用扩展正则表达式支持
  • (.*"commit"[^"]*)-(第一个捕获组)从行开始到"commit"的所有内容,然后是第一次出现文字"的所有内容
  • .*剩余行
  • 1"${sha}""-替换为第一个捕获组的内容,后跟文字",sha变量的内容和另一个文字"

一旦对结果满意,可以添加-i选项:

$ sed -Ei "s/^(.*"commit"[^"]*).*/1"${sha}"/" file.config
$ cat file.config
{
"commit" : "441d6fc22"
}

将原始git调用拉入混合:

read -r sha < <(git rev-parse --short HEAD)
sed -Ei "s/^(.*"commit"[^"]*).*/1"${sha}"/" file.config