我有一個文件some.properties
,它有參數。
DATABASE_NAME=${DB_NAME}
DATABASE_HOST=${DB_HOST}
..
..
..
我有另一個文件,它是demo.json
文件並且具有值:
{
"database_conf" : {
"DB_NAME": "ABC",
"DB_HOST": "HOST_ABC",
"..": "..",
"...": "..."
}
}
如何編寫 shell 腳本檔案以使用檔案some.properties
中提到的值更新檔案demo.json
。
非常感謝您的幫忙。
答案1
解析 JSON 文件以jq
建立sed
腳本,然後在您的文件上執行該腳本:
$ jq -r '.database_conf | to_entries | .[] | "s,=\\${\(.key)},=\"\(.value)\","' demo.json | sed -f /dev/stdin some.properties
DATABASE_NAME="ABC"
DATABASE_HOST="HOST_ABC"
..
..
..
此表達式將為物件中的每個鍵值對jq
建立一個表達式。給定資料的輸出將是以下腳本:sed
.database_conf
jq
sed
s,=\${DB_NAME},="ABC",
s,=\${DB_HOST},="HOST_ABC",
s,=\${..},="..",
s,=\${...},="...",
然後讀取該sed -f
檔案以對屬性檔案執行實際替換。
這假設屬性檔案中的每個變數都寫為且${variablename}
它們始終緊接在一個=
字元前面。
要就地進行更改,您可能需要使用sed -i
,否則將結果重定向到新檔案。
如果您的資料包含逗號,請將 的輸出表達式中的逗號變更jq
為資料中未使用的其他字元。
如果您有其他帶有配置的頂級對象,請將它們作為逗號分隔清單新增至表達式的開頭jq
。例如:
jq -r '.application_conf, .database_conf | to_entries (..etc..)
答案2
有更合適的工具來處理 JSON 檔案。對於這個簡單的情況,awk
可能就夠了:
awk '
NR == FNR {gsub (/[ ",]/, _) # in first file, remove "punctuation" chars
T[$1] = $2 # and save replacement values in T array
next
}
{P = $2 # create pattern
gsub (/[${}]/, _, P) # with redundant / undesired chars removed
}
P in T {sub (P, T[P], $2) # if pattern shows up, replace it
}
1
' FS=":" file2 FS="=" file1
DATABASE_NAME ${ABC}
DATABASE_HOST ${HOST_ABC}