2015-11-04 1 views
1

У меня есть ниже JSON файл test.jsonКак добавить новый элемент в файл JSON из сценария оболочки

{ 
      "run_list": ["recipe[cookbook-ics-op::setup_server]"], 
      "props": { 
       "install_home": "/inst1", 
          "tmp_dir": "/inst1/tmp", 
       "user": "rven" 
       } 
} 

из сценария оболочки, я должен добавить еще 2 свойства под реквизитом. Я не хочу сначала читать существующее содержимое &, а затем добавлять к нему. Может ли кто-нибудь помочь, как я могу это сделать?

+0

Если вы не прочитали существующее содержимое, то откуда вы можете узнать, где вы можете добавить его? –

ответ

0

Постарайся СЭД:

sed -e 's/"props": {/"props": { "foo": "bar", "spam": "eggs",/' test.json 

Результат:

{ 
     "run_list": ["recipe[cookbook-ics-op::setup_server]"], 
     "props": { "foo": "bar", "spam": "eggs", 
      "install_home": "/inst1", 
         "tmp_dir": "/inst1/tmp", 
      "user": "rven" 
      } 
} 
+0

Это работает только в том случае, если форматирование очень специфично. Что делать, если 'props' запускается пустым, и в этом случае конечная запятая нарушит синтаксис? Что делать, если вместо символа ':' есть новая строка, а не пробел? Что делать, если один из ключей уже существует? –

+0

Кроме того, это будет неправильно, если в файле есть другой ключ с именем 'props'. –

+0

@CharlesDuffy: вы не ошибаетесь, но OP попросил что-то, что работает с ** этим ** файлом, а не для пуленепробиваемого решения. Пусть он судит, достаточно ли этого. –

0

Используйте JSON-Aware инструмент, как jq. Для того, чтобы добавить два свойства, foo и bar:

jq '.props.foo="hello" | .props.bar="bye"' <in.json >out.json 

Если вы хотите использовать переменные оболочки для значений:

foo=hello; bar=bye 
jq --arg foo="$foo" \ 
    --arg bar="$bar" \ 
    '.props.foo=$foo | .props.bar=$bar' \ 
    <in.json >out.json 

Если вы хотите, чтобы иметь возможность указать как ключ и значение с оболочкой переменные:

key=hello; val=world 
jq --arg key="$key" \ 
    --arg val="$val" \ 
    '.props[$key]=$val' \ 
    <in.json >out.json 
Смежные вопросы