Замена пары ключ-значение пробелами с помощью jq - PullRequest
0 голосов
/ 20 марта 2019

У меня есть файл свойств и файл json. Файл свойств содержит пары ключ-значение, которые необходимо заменить в json.

Когда значение не имеет пробелов, оно работает как положено, но когда значение имеет пробелы, значение не заменяется.

Скрипт, заменяющий значения

#!bin/bash
echo hello

while read line;
do
#echo $line
key=$(echo "$line" |cut -d':' -f1)
#echo $part1
value=$(echo "$line" |cut -d':' -f2)
if [[ ! -z $value ]];
then
key="\"$key\""
value="\"$value\""
echo $key : $value
jq '.parameters |= map( if .name == '$key' then .default = '$value' else . end )' cam.json > cam1.json
mv cam1.json cam.json
fi
done < prop.properties

файл свойств

git_con_type:something
git_host_fqdn:something again
git_user:something again again
git_user_password:something
git_repo:something
git_repo_user:
git_branch:

Файл JSON

{
"name": "${p:Instance_Name}",
  "parameters": [
    {
      "name": "git_con_type",
      "default": "",
      "immutable_after_create": false
    },
    {
      "name": "git_host_fqdn",
      "default": "hello",
      "immutable_after_create": false
    },
    {
      "name": "git_user",
      "default": "",
      "immutable_after_create": false
    },
    {
      "name": "git_user_password",
      "default": "Passw0rd",
      "immutable_after_create": false
    },
    {
      "name": "git_repo",
      "default": "lm",
      "immutable_after_create": false
    },
    {
      "name": "git_repo_user",
      "default": "-Life",
      "immutable_after_create": false
    },
    {
      "name": "git_branch",
      "default": "master",
      "immutable_after_create": false
    },
    {
      "name": "git_clone_dir",
      "default": "/opt/git",
      "immutable_after_create": false
    }
  ]
}

Error

jq: error: синтаксическая ошибка, неожиданный конец $, ожидание QQSTRING_TEXT или QQSTRING_INTERP_START или QQSTRING_END (проблемы цитирования оболочки Unix?) В строке 1: .parameters | = map (если .name == "git_host_fqdn", то .default = "что-то jq: error: возможно, неопределенный оператор if в строке 1: .parameters | = map (если .name == "git_host_fqdn", то .default = "что-то JQ: 2 ошибки компиляции

как я могу заставить jq принимать значения с пробелом? Я пробовал jqplay с пробелами, и он работает там, но не на сценарии.

1 Ответ

3 голосов
/ 20 марта 2019

Было бы намного лучше передать $ key и $ value в jq, как показано в следующей (намеренно минималистской) настройке вашего скрипта:

#!/bin/bash

while read line
do
  key=$(echo "$line" |cut -d':' -f1)
  value=$(echo "$line" |cut -d':' -f2)
  if [[ ! -z "$value" ]]
  then
     jq --arg key "$key" --arg value "$value" '.parameters |= map( if .name == $key then .default = $value else . end )' cam.json > cam1.json
     mv cam1.json cam.json
fi
done < prop.properties

Было бы еще лучше избежать цикла bashв общем и делать все с помощью всего одного вызова jq.

Однопроходное решение

Идея состоит в том, чтобы создать словарь ($ dict) пар ключ-значение, что легко сделать с помощьювстроенный фильтр INDEX/1:

INDEX(inputs | split(":") | select(.[1] | length > 0); .[0])
| map_values(.[1]) as $dict
| $cam
| .parameters |= map( $dict[.name] as $value | if $value then .default = $value else . end )

Вызов

С помощью вышеуказанной программы jq в program.jq:

jq -n -R -f program.jq --argfile cam cam.json prop.properties > cam1.json && mv cam1.json cam.json

Или с использованием sponge:

jq -n -R -f program.jq --argfile cam cam.json prop.properties | sponge cam.json

Обратите внимание, в частности, на параметр -n, который необходим, потому что program.jq использует inputs.

...