將一個檔案 (.properties) 上的參數值替換為另一個檔案 (.json) 中的值

將一個檔案 (.properties) 上的參數值替換為另一個檔案 (.json) 中的值

我有一個文件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_confjqsed

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}

相關內容