Как извлечь текст внутри блока в файле HCL (HashiCorp Configuration Language) с помощью Bash? [закрыто]

У меня есть файл языка конфигурации HashiCorp (HCL) с этим блоком.

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

Мне нужен только приведенный ниже текст и назначить отдельные строки различным переменным оболочки.

gdb_name
sid_name
createContainerDB
numberOfPDBs
pdb_name
oracle_database_sid

Но загвоздка в том, что текст в database = {} может измениться. Итак, мне нужно динамически извлечь текст из database = {} , а затем назначить его переменным.

Как я могу добиться этого с помощью Bash?

0
задан 18 October 2019 в 09:58
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/
0
ответ дан 5 December 2019 в 00:21

Теги

Похожие вопросы