2015-11-04 36 views
1

添加到一個JSON文件我有以下JSON文件test.json如何將新元素從一個shell腳本

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

從shell腳本,我一定要在道具增加2個屬性。我不想先閱讀現有內容&然後添加到它。任何人都可以幫助我如何做到這一點?

+0

如果您沒有閱讀現有內容,那麼如何知道可以添加到哪些內容? –

回答

0

儘量sed的:

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。要添加兩個屬性,foobar

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

如果你想使用shell變量的值:如果你希望能夠指定鍵和值與殼

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 
相關問題