我试图将输出从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