我有一个包含多行代码的 puppet 文件,其中有一个部分如下所示:
$defaultrepo=myrepo
$defaultbranch=mybranch
gitmod::pullstuff {'othergitcode':
gitcommit => "b54123be540adrwer3b65872384e0101c5f94c926b81",
gitorg => "${defaultrepo}",
branch => "${defaultbranch}",
}
gitmod::pullstuff {'mygitcode':
gitcommit => "b54123be540adrfer3b65872384e0101c5f94c926b81",
gitorg => 'awesomerepo',
branch => "master",
}
它可以具有任意数量的 block ,这些 block 看起来类似于上面列出的两个代码块。
我正在寻找一种方法来解析文件并将值作为变量提取,然后使用它们来获取最新的 git 提交并更新值。我正在考虑在 bash 脚本中使用 awk 和 sed,以便它可以执行类似的操作。 例如
values could be:
$gitrepo=mygitcode
$gitorg=awesomerepo
$gitbranch=master
<pre><code>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
</code></pre>
我不是一名开发人员,所以请耐心等待。有人可以指出一般结构应该是什么样子吗?不用担心正则表达式等,我可以搞乱并解决这个问题。只是想知道我如何才能得到它,以便它单独处理它找到的每个“ block ”。由于某种原因,我无法让 awk 正确地将它们分开,这会弄乱格式。
就像我可以做这样的事情:
<code>awk "/gitmod::pullstuff/{a=4}{if(a-->0){print;next}}"</code>
它会 pull 出我想要的一切。我需要的是以某种方式将其粘贴到 for 语句中,以便我可以将 awk 找到的每个实例视为一个单独的 block ,我也可以做一些事情。
最佳答案
您可以尝试以下操作:
awk -f m.awk puppetfile.pp puppetfile.pp
其中m.awk
是:
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
}
关于git - 使用 awk sed 解析更新 puppet 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20613771/