我有一个包含多行代码的木偶文件,其中有一个部分如下所示:
$defaultrepo=myrepo
$defaultbranch=mybranch
gitmod::pullstuff {'othergitcode':
gitcommit => "b54123be540adrwer3b65872384e0101c5f94c926b81",
gitorg => "${defaultrepo}",
branch => "${defaultbranch}",
}
gitmod::pullstuff {'mygitcode':
gitcommit => "b54123be540adrfer3b65872384e0101c5f94c926b81",
gitorg => 'awesomerepo',
branch => "master",
}
它可以具有任意数量的块,这些块看起来类似于上面列出的两个代码块。
我正在寻找一种方法来解析文件并将值作为变量提取,然后使用它们来获取最新的 git 提交并更新值。我正在考虑在 bash 脚本中使用 awk 和 sed,以便它可以执行类似的操作。
例如
values could be:
$gitrepo=mygitcode
$gitorg=awesomerepo
$gitbranch=master
for i in $(awk "regexto pull out each block from gitmod::pullstuff \{'whatever': through to the ending \}" puppetfile.pp);
do
$gitrepo="sed/awk to pullout git repo"
$gitorg="sed/awk to pullout git org"
$gitbranch="sed/awk to pullout git branch"
$newcommit=git ls-remote https://github.com/$gitorg/$gitrepo.git refs/heads/$gitbranch
sed -i "replace commit with $newcommit"
done
你可以尝试这样的事情:
awk -f m.awk puppetfile.pp puppetfile.pp
where m.awk
is:
NR==FNR {
if (/^gitmod/) {
gitrepo=getRepo()
getline
getline
gitorg=getOrg()
getline
branch=getBranch()
com[++i]=getNewCommit()
}
else if (/^\$[[:alnum:]]*=/) {
vn=getVarName()
val=getVarValue()
var[vn]=val
}
next
}
/^gitmod/ {
print
getline
sub(/".*"/,"\""com[++j]"\"")
}
{ print }
function getVarValue(a) {
match($0,/=([[:alnum:]]+)[[:blank:]]*/,a)
return a[1]
}
function getVarName(a) {
match($0,/\$([[:alnum:]]+)=/,a)
return "${"a[1]"}"
}
function getNewCommit(cmd,var) {
cmd="ls-remote https://github.com/"gitorg"/"gitrepo".git refs/heads/"branch
cmd |& getline var
return var
}
function getBranch(a,br) {
match($0,/"(.*)"/,a)
br=a[1]
if (br in var) br=var[br]
return br
}
function getOrg(a,org) {
match($0,/"(.*)"/,a)
org=a[1]
if (org in var) org=var[org]
return org
}
function getRepo(a,rep) {
match($0,/\{"(.*)":/,a)
rep=a[1]
if (rep in var) rep=var[rep]
return rep
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)