首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AWK转换不同类型的字符串

使用AWK转换不同类型的字符串
EN

Stack Overflow用户
提问于 2021-08-25 13:33:10
回答 1查看 36关注 0票数 0

我的配置文件中有以下变量:

代码语言:javascript
复制
tags = {
    environment  = "development",
    provider     = "ServiceOne",
    ansible_role = "nfs-role",
    comment      = "mysql"
}
line                       = "b01"
my_lb_ports                = "[53, 80, 443, 389, 636, 3268, 3269, 6443]"
dns_servers                = "[\"8.8.8.8\", \"9.9.9.9\"]"

对于我的Pipeline,我需要将其转换为以下内容:

代码语言:javascript
复制
tfh pushvars -overwrite-all -dry-run false -hcl-var "tags={environment=\"development\", provider=\"ServiceOne\", ansible_role=\"nfs-rolep\",comment= \"mysql\"}"

tfh pushvars -overwrite-all -dry-run false -hcl-var "line=\"b01\""

tfh pushvars -overwrite-all -dry-run false -hcl-var "my_lb_ports=[\"53\", \"80\", \"443\", \"389\", \"636\", \"3268\", \"3269\", \"6443\"]"

tfh pushvars -overwrite-all -dry-run false -hcl-var "dns_servers=[\"8.8.8.8\", \"9.9.9.9\"]"

下面的脚本是在@Ed Morton的支持下创建的,但它仍然不能识别所有模式:

代码语言:javascript
复制
#!/usr/bin/env bash

(( $# == 2 )) || { echo "==> Usage: ./${0##*/} <<INPUT_FILE>> <<OUTPUT_FILE>>"; exit 1; }

vars_file="$1"
output_file="$2"


awk '
    BEGIN {
        ORS = ""
        print "tfh pushvars -overwrite-all -dry-run false -hcl-var \""
    }
    NF && !/^#/ {
        gsub(/[[:space:]]/,"")
        gsub(/"/,"\\\\&")
        print
    }
    END {
        print "\"\n"
    }
' "$vars_file" > "$output_file"

awk -F'=' '{ gsub( /\x22/ ,"\x5c\\&", $2 ); gsub( / / ,"", $1 ); gsub( / / ,"", $2 );  print "tfh pushvars -overwrite-all -dry-run false -hcl-var \x22" $1 "=" $2 "\x22"}'  "$vars_file" >> "$output_file"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-25 13:57:31

这是一个很好的开始,您需要弄清楚如何调整输出行中的"

代码语言:javascript
复制
$ cat tst.sh
#!/usr/bin/env bash

(( $# == 2 )) || { echo "==> Usage: ./${0##*/} <<INPUT_FILE>> <<OUTPUT_FILE>>"; exit 1; }

vars_file="$1"
output_file="$2"

awk '
    BEGIN {
        ORS = ""
        beg = "tfh pushvars -overwrite-all -dry-run false -hcl-var \""
        end = "\"\n"
    }
    /^[[:alnum:]_]+[[:space:]]*=/ {
        gotBlockBeg = 1
        gotBlockEnd = ( $NF == "{" ? 0 : 1 )
    }
    gotBlockBeg {
        block = block $0
        if ( $NF == "}" ) {
            gotBlockEnd = 1
        }
    }
    gotBlockEnd {
        gsub(/[[:space:]]/,"",block)
        gsub(/"/,"\\\\&",block)
        print beg block end
        gotBlockBeg = gotBlockEnd = 0
        block = ""
    }
' "$vars_file" > "$output_file"
代码语言:javascript
复制
$ ./tst.sh file foo
代码语言:javascript
复制
$ cat foo
tfh pushvars -overwrite-all -dry-run false -hcl-var "tags={environment=\"development\",provider=\"ServiceOne\",ansible_role=\"nfs-role\",comment=\"mysql\"}"
tfh pushvars -overwrite-all -dry-run false -hcl-var "line=\"b01\""
tfh pushvars -overwrite-all -dry-run false -hcl-var "my_lb_ports=\"[53,80,443,389,636,3268,3269,6443]\""
tfh pushvars -overwrite-all -dry-run false -hcl-var "dns_servers=\"[\\"8.8.8.8\\",\\"9.9.9.9\\"]\""

在您不了解awk脚本中发生了什么的地方添加调试print语句,或者使用gawk调试器(gawk -D ...)运行它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68923925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档