'sed' не заменяет текст в файле

Я пытаюсь заменить токены в файле JSON значениями, хранящимися в нашем предпочтительном инструменте CI (Bamboo).

Для этого я использую jq для извлечения массива values, а затем заменяю токен в каждом значении на соответствующее значение переменной Bamboo.

1113 Однако что-то не работает. Вывод скрипта подтверждает, что маркер замены найден и что значение переменной Bamboo является правильным.

Что я делаю не так?

ENV_FILE_PATH="./landmark-accounts-uat.postman_environment.json"
VALUES=$(cat ./landmark-accounts-uat.postman_environment.json | jq -c '.values[]')
for ELEMENT in $VALUES; do

        ### Extract the variable name and replacement token (e.g. '#{varName}') for the current element.
        ELEMENT_NAME=$(echo $ELEMENT | jq -r '.key')
        ELEMENT_REPLACEMENT_TOKEN=$(echo $ELEMENT | jq -r '.value')

        ### Construct the name of the Bamboo variable to use for replacement.
        BAMBOO_VARIABLE_NAME=bamboo\_$ELEMENT_NAME
        BAMBOO_VARIABLE_VALUE=${!BAMBOO_VARIABLE_NAME}

        ### Replace the current value with the value of the Bamboo variable.
        echo "Replacing '$ELEMENT_REPLACEMENT_TOKEN' with the value of Bamboo variable '$BAMBOO_VARIABLE_NAME' ($BAMBOO_VARIABLE_VALUE)."
        sed -i 's/$ELEMENT_REPLACEMENT_TOKEN/$BAMBOO_VARIABLE_VALUE/g' $ENV_FILE_PATH
done

Пример файла JSON

Ниже приведен пример файла JSON до его редактирования с помощью sed.

Как видите, для каждого value есть токены замены, и я пытаюсь заменить их переменными Бамбука. В этом случае эти переменные будут называться $bamboo_apiUrl и $bamboo_apimKey.

{
  "id": "b10a67a9-75a1-49fc-8b6d-9063388ed35c",
  "name": "my-env",
  "values": [
    {
      "key": "apiUrl",
      "value": "#{apiUrl}",
      "enabled": true
    },
    {
      "key": "apimKey",
      "value": "#{apimKey}",
      "enabled": true
    },
  ],
  "_postman_variable_scope": "environment",
  "_postman_exported_at": "2019-09-27T09:13:43.208Z",
  "_postman_exported_using": "Postman/7.8.0"
}

Обновление

Основываясь на предложении в комментариях, это решение, которое я использую.

#!/bin/bash

### Read in the environment file in full.
ENV_FILE_PATH="./landmark-accounts-uat.postman_environment.json"
ENVIRONMENT_FILE=$(cat $ENV_FILE_PATH)

### Get all of the value keys from the environment file.
KEYS=$(cat $ENV_FILE_PATH | jq --raw-output '.values[].key')

### Iterate value keys...
for KEY in $KEYS; do
        ### Construct the name of the Bamboo variable to use for 'value' for the current 'key', then get the value of that variable.
        BAMBOO_VARIABLE_NAME=bamboo\_$KEY
        BAMBOO_VARIABLE_VALUE=${!BAMBOO_VARIABLE_NAME}

        ### Replace the value for the currently 'key'.
        echo "Replacing value of key '$KEY' with the value of Bamboo variable '$BAMBOO_VARIABLE_NAME' ($BAMBOO_VARIABLE_VALUE)."
        ENVIRONMENT_FILE=$(echo $ENVIRONMENT_FILE | jq --arg key "$KEY" --arg value "$BAMBOO_VARIABLE_VALUE" '.values |= map(if .key == $key then .value = $value else . end)')
done

### Output the updated environment file.
echo $ENVIRONMENT_FILE > $ENV_FILE_PATH
2
задан 21 November 2019 в 20:01

1 ответ

Вы заключили переменные в кавычки с одинарными кавычками, но:

символы Включения в одинарных кавычках сохраняет литеральное значение каждого символа в кавычках.

Вы don’t хотят это, Вы хотите $ иметь его особое значение к оболочке для оценки переменных. Таким образом используйте двойные кавычки вместо этого:

sed -i "s/$ELEMENT_REPLACEMENT_TOKEN/$BAMBOO_VARIABLE_VALUE/g" $ENV_FILE_PATH

На самом деле, ни один из “s”, “/” или “g” требует заключение в кавычки, таким образом, в зависимости от переменного содержания можно даже позволить целому закрывшему кавычки выражению. Однако it’s, всегда желательный для заключения в кавычки переменных.

можно легко протестировать эффекты заключения в кавычки путем предварительного ожидания echo, просто добавить эти две строки и сравнить вывод:

echo sed -i 's/$ELEMENT_REPLACEMENT_TOKEN/$BAMBOO_VARIABLE_VALUE/g' $ENV_FILE_PATH
echo sed -i "s/$ELEMENT_REPLACEMENT_TOKEN/$BAMBOO_VARIABLE_VALUE/g" $ENV_FILE_PATH

Дополнительные материалы для чтения

3
ответ дан 2 December 2019 в 02:38

Другие вопросы по тегам:

Похожие вопросы: