Как редактировать значение в JSON с помощью Sed - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть следующий файл json:

"environment": [
        {
          "name": "DD_AGENT_HOST",
          "value": "somevalue.com"
        },
        {
          "name": "DD_AGENT_PORT",
          "value": "1234"
        },
        {
          "name": "DD_TRACE_SPAN_TAGS",
          "value": "env:test"
        },
        {
          "name": "JAVA_OPTS",
          "value": "-javaagent:/dd-java-agent/dd-java-agent.jar -Xms512m -Xmx2548m -XX:MaxPermSize=512m -Dspring.profiles.active=testapp -Dspring.cloud.config.label=<some value> -Duser.timezone=America/New_York"
        }

Я пытаюсь изменить определенный параметр в значении для ключа "JAVA_OPTS".Это часть работы Дженкинса,

Это то, чего я пытаюсь достичь, - это возможность изменить значение параметра $ {Config_Label} -Dspring.cloud.config.label=${Config_Label}

И я попыталсяэто решение, которое, кажется, не работает:

sed -i "/value/c\   \"value\" : \"-javaagent:/dd-java-agent/dd-java-agent.jar -Xms512m -Xmx2548m -XX:MaxPermSize=512m -Dspring.profiles.active=testapp -Dencrypt.key=bjb4343knwdc -Dspring.cloud.config.label=${Config_Label} -Duser.timezone=America/New_York"\"," file.json

Но синтаксис не работает, и задание Jenkins завершается с ошибкой

неожиданный EOF при поиске соответствия "" "

Надеюсь, что кто-то может исправить меня здесь. Спасибо.

Ответы [ 5 ]

0 голосов
/ 20 декабря 2018

Поскольку

Dspring.cloud.config.label

происходило только один раз в файле json, я использовал функцию sed, как упомянуто одним изпользователи (Мохит Раторе).Возможно, это не исключительное решение, но оно было простым и сработало в этом случае.

sed -i "s/Dspring.cloud.config.label=\S*/Dspring.cloud.config.label=${Config_Label}/g" file.json 

Спасибо.

0 голосов
/ 20 декабря 2018

Если файл содержит Dspring.cloud.config.label только один раз

Вы можете напрямую использовать это:

 sed 's/Dspring.cloud.config.label=\S*/Dspring.cloud.config.label=${Config_Label}/g' json

, если вы хотите зафиксировать это изменениев ваш путь -i после sed

, но если строка Dspring.cloud.config.label появляется несколько раз, пожалуйста, поделитесь более подробной информацией о файле.

enter image description here

0 голосов
/ 20 декабря 2018

При изменении объектов в jq все, что требуется на самом деле:

  1. Найдите объект, который вы хотите обновить

    # the environment object with the name "JAVA_OPTS"
    .environment[] | select(.name == "JAVA_OPTS")
    
  2. Назначитьновое значение для свойства, которое вы хотите обновить

    # update the value property using (= or |=)
    .environment[] | select(.name == "JAVA_OPTS").value = ...
    

На данный момент, просто вопрос об обновлении строки для замены чем-то другим.Вы можете использовать регулярное выражение, чтобы выполнить замену или любой другой подход к замене, который вам нужен:

sub("(?<k>-Dspring\\.cloud\\.config\\.label)=<some value>"; "\(.k)=${Config_Label}")

Соберите все это вместе:

.environment[] | select(.name == "JAVA_OPTS").value
    |= sub("(?<k>-Dspring\\.cloud\\.config\\.label)=<some value>"; "\(.k)=${Config_Label}")
0 голосов
/ 20 декабря 2018

Вы также можете сделать это с помощью простого скрипта Node.Если переменная среды оболочки, скажем, VERSION, вы можете использовать следующий сценарий для этой замены, а также другие возможные манипуляции с файлом для запускаемого вами процесса сборки:

#!/usr/bin/env node
// replace.js
const chunks = [];

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', (chunk) => {
    chunks.push(chunk);
});

process.stdin.on('end', () => {
    const json = JSON.parse(chunks.join(''));

    // Process json.environment array
    json.environment = json.environment.map(obj => {
        if (obj.name == 'JAVA_OPTS') {
                obj.value = obj.value.replace(/(-Dspring.cloud.config.label=)([^\s]+)/, `$1${process.env.VERSION}`);
        }
        return obj;
    });

    process.stdout.write(JSON.stringify(json, null, 2));
    process.stdout.write('\n');
});

Затем вы можетезапустите его как:

$ VERSION=v6.7 ./replace.js < YOURFILE.json
0 голосов
/ 20 декабря 2018

Используйте ' для включения сценария sed, чтобы избежать экранирования ".Ваша цель - найти JAVA_OPTS, а затем изменить строку в строке после.

У меня всегда есть этот открытый учебник, чтобы помочь: Sed - Введение и учебник от БрюсаBarnett

N: эта команда sed читает следующую строку в файле и переносит ее в буфер шаблонов.

В приведенном ниже примере показано, как это сделать.легко сломается при изменении данных json;рекомендуется использовать jq, как предложено @Iniam.

Если вы все еще хотите, чтобы что-то работало для примера в вашем вопросе, попробуйте следующее:

sed -i '/"name"[[:blank:]]*:[[:blank:]]*"JAVA_OPTS"[[:blank:]]*,/ { N ; s/-Dspring.cloud.config.label=\(.*\) -Duser/-Dspring.cloud.config.label=${Config_Label} -Duser/ ; }' file.json

То жеверсия в несколько строк:

sed -i '/"name"[[:blank:]]*:[[:blank:]]*"JAVA_OPTS"[[:blank:]]*,/ {
    N
    s/-Dspring.cloud.config.label=\(.*\) -Duser/-Dspring.cloud.config.label=${Config_Label} -Duser/
} ' file.json
...