git - 使用 awk sed 解析更新 puppet 文件

标签 git bash sed awk puppet

我有一个包含多行代码的 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/

相关文章:

git - 如何将特定远程 pull 入 VS Code 中的当前分支

bash - gnu 并行 : combined use of --pipe and args

bash - 使用 getopt 解析长参数会跳到第一个值

linux - 使用命令行工具进行大量 XML 编辑

linux - 在 sed/awk/grep 中将日期从 2012-01-31 更改为 31-01-2012

git - 克隆有效,远程推送无效。通过 copssh 的远程存储库

git - 为什么在压榨后错误切换分支?没什么可 promise 的

linux - 将 --mirror push Git 存储库时出现重复文件错误

bash - 等到docker通过shell脚本在Mac OS中启动?

perl - 如何仅在您指定的某个任意字段上进行正则表达式替换