пятница, 27 сентября 2019 г.

AWK power: Файл с параметрами: если есть параметр то меняем его значение на новое, если такого параметра еще нет - добавим

Прям порой надо такие штуки делать и время уходит не мало что бы отработать такой скрипт.
Есть файл с параметрами в виде пар NAME=VALUE.
Задача - если в этом файле уже есть определенные переменные с какими то значениями, то нужно им присвоить новые значения, а если таких переменных еще в файле нет - добавить их с уже новыми значениями.
Например, был такой файл с параметрами:
cat app.tfvars
appName = "app1"
appRepo = "ssh:git-repo@:name"
appBranch = "master"

Нужно при очередном прогоне заменять всегда ТРИ переменные
 - appRepo
 - appBranch
 - appUser
 (в примере только две нужные переменные уже есть , а третьей, appUser, еще нет).

Вот эти новые значения, которые мы как то получили в процессе (jenkins Job например их выставил)
--------------------------
APP_REPO="ssh:GIT"
APP_BRANCH="production"
APP_USER="kino505"
-------------------------
Хочу в один проход по файлу сделать две задачи сразу - заменить если есть такая переменная и добавить, если еще нет.

awk -v appRepo=${APP_REPO} -v appBranch=${APP_BRANCH} -v appUser=${APP_USER} '
    BEGIN {FS = OFS = "=";
    envVars["appRepo"]=appRepo;
    envVars["appBranch"]=appBranch;
    envVars["appUser"]=appUser;}
    {gsub(/ /,"",$1)1; gsub(/ |\"/,"",$2)1} $1 in envVars {$2 = envVars[$1];delete envVars[$1]}
    {print $1" "," \""$2"\""}
    END { for(i in envVars) print i" "," \""envVars[i]"\"" }
' app.tfvars > tmp.file && mv tmp.file app.tfvars

После отработки итоговый файл:

appName = "app1" <-- p="" unchanged="">appRepo = "ssh:GIT" <--- p="" replaced="">appBranch = "production" <--- p="" replaced="">appUser = "kino505"  <---- added="" because="" found="" not="" p="" string="">
PS: но было бы здорово если бы получилось бы передать ассоциативный массив в виде параметров в виде имя-значение (list of maps) в AWK. У меня не получилось. Может кто знает как?


Комментариев нет: