如何使用 Bash 提取 HCL(HashiCorp 配置语言)文件中块内的文本?

如何使用 Bash 提取 HCL(HashiCorp 配置语言)文件中块内的文本?

我有一个包含此块的 HashiCorp 配置语言 (HCL) 文件。

database = {
    gdb_name            =   "XXXXX"
    sid_name            =   "XXXXX"
    createContainerDB   =   "True"
    numberOfPDBs        =   "1"
    pdb_name            =   "XXXXX"
    oracle_database_sid =   "XXXXX"
}

我只需要其中的以下文本并将各行分配给不同的 shell 变量。

gdb_name
sid_name
createContainerDB
numberOfPDBs
pdb_name
oracle_database_sid

但这里的问题是,文本database = {}可能会发生变化。因此,我需要database = {}动态提取文本,然后将其分配给变量。

如何使用 Bash 实现这一点?

答案1

sed虽然它不是特别漂亮,但它可以完成工作:

$ cat foo.txt
foo = {
    gdb_name            =   "XXXXX"
    sid_name            =   "XXXXX"
    createContainerDB   =   "True"
    numberOfPDBs        =   "1"
    pdb_name            =   "XXXXX"
    oracle_database_sid =   "XXXXX"
}

database = {
    gdb_name            =   "XXXXX"
    sid_name            =   "XXXXX"
    createContainerDB   =   "True"
    numberOfPDBs        =   "1"
    pdb_name            =   "XXXXX"
    oracle_database_sid =   "XXXXX"
}

bar = {
    sid_name            =   "XXXXX"
    createContainerDB   =   "True"
    numberOfPDBs        =   "1"
    pdb_name            =   "XXXXX"
}
$ sed -e '/^database = {/,/^}/!d;/ *\([^ ][^ ]*\) *= *.*"/!d; s//\1/' foo.txt
gdb_name
sid_name
createContainerDB
numberOfPDBs
pdb_name
oracle_database_sid

它会删除不在database = {和之间的行}。然后检查行是否看起来像属性。如果不是,它会删除该行。如果是,它会使用正则表达式(与上一个匹配项共享)替换除属性名称之外的所有内容。

当脚本sed在单独的行上整齐排列时,看起来如下所示:

/^database = {/,/^}/!d
/ *\([^ ][^ ]*\) *= *.*"/!d
s//\1/

相关内容