Как добавить значение json в файл json с помощью скрипта bash

JSON-файл следующим образом:

{

      "ImageId": "ami-074acc26872f26463",
      "KeyName": "Accesskeypair",
      "SecurityGroupIds": ["sg-064caf9c470e4e8e6"],
      "InstanceType": ""
      "Placement": {
        "AvailabilityZone": "us-east-1a"
      }
}

читать тип #input от пользователя

теперь я хочу добавить значение json в «InstanceType»: «$ type» в файле с помощью сценария bash, который я пробовал sed, cat и echo

echo "Hello"
echo "lets create an instance"  
echo "please enter the type of instance you need"
read instance_type;
echo $type
 sed -a '|\InstanceType": "|$instance_type|a' awsspotinstancecreation.json
 sed -e '/\"InstanceType": "|$instance_type|/a' awsspotinstancecreation.json
 sed -i "/\InstanceType": "/ s/^\(.*\)\('\)/\1, $instance_type/" awsspotinstancecreation.json
 sed -e 's/^"InstanceType": "",.*$/"InstanceType": "$instance_type",/g' awsspotinstancecreation.json
 sed -i 's/^InstanceType .*$/"InstanceType": "$instance_type",/' awsspotinstancecreation.json
 sed -i 's:^"InstanceType": "",.*$:"InstanceType": "$instance_type",:a' awsspotinstancecreation.json

но когда я это делаю, появляется «InstanceType»: «$ type» вместо «InstanceType»: «t2.small»

Вернитесь и отредактируйте свой оригинальный вопрос.

vintnes 10.06.2019 11:05

Ваш файл недействителен json. Вам не хватает запятой после значения InstanceType. Как я уже сказал в другой теме, не используйте sed, используйте jq

vintnes 10.06.2019 11:08
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
2
544
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать облегченный процессор JSON под названием jq.

после загрузки файла вы можете использовать jq '.InstanceType = "Это значение экземпляра"

Вы можете взять ссылку из Добавьте новый элемент в существующий массив JSON, используя jq

Ответ принят как подходящий

использование опции -e не изменит файл, вместо этого он распечатает вывод в терминале.

-i изменит файл.

использование регулярного выражения .* обновит файл и конкретный ключ, имеющий любое значение

и использование \"\" будет искать только пустую строку и обновлять значение.

попробуй это:

sed -i "s/\"InstanceType\":.*,$/\"InstanceType\": \"${instance_type}\",/g" awsspotinstancecreation.json

ИЛИ

sed -i "s/\"InstanceType\": \"\",$/\"InstanceType\": \"${instance_type}\",/g" awsspotinstancecreation.json

огромное спасибо бро!!! это работает отлично, и спасибо за объяснение ... много значит!

shrikkanth roxor 10.06.2019 17:27

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

Как обрабатывать кавычки, специальные символы обратной кавычки для запуска команды оболочки linux bash на удаленном сервере
Регулярное выражение, чтобы получить три числа из строки и поместить их в переменную в bash
Нет вывода от ''tail -f | глазеть | тройник''; либо ''хвост -f | глазеть» или «глазеть | тройник работает нормально
Сделайте так, чтобы синтаксис параметра командной строки соответствовал имени папки, если оно похоже на это
Сценарий Bash, не обнаруживающий mysqld, установлен, но работает при запуске вручную
Как обрабатывать ВСЕ сообщения об ошибках, даже если команда не работает?
Помощь с функцией транспонирования с использованием Bash
Команда присоединиться не показывает желаемый результат
Не удается вытащить каталог .vim/
Почему я должен вводить исходный файл env.sh, прежде чем смогу использовать программное обеспечение для обработки геофизических данных под названием Madagascar?