У меня есть файл HashiCorp Configuration Language (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?
Это делает работу в 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/