2014-01-08 2 views
-4

Мне нужна помощь в написании скрипта для редактирования file.json. Ниже приведен файл в формате JSON:BASH: отредактируйте файл JSON

{ 
    "version" : "1.0", 
    "analytics" : { 
     "rsids" : "", 
     "charset" : "UTF-8", 
     "ssl" : false, 
     "offlineEnabled" : true, 
     "lifecycleTimeout" : 300, 
     "privacyDefault" : "optedin", 
     "poi" : [] 
    }, 
    "target" : { 
     "clientCode" : "", 
     "timeout" : 5 
    }, 
    "audienceManager" : { 
     "server" : "" 
    } 
} 

мне нужно отредактировать выше file.json и указать значения для rsids, код клиента и сервера.

+0

http://xmodulo.com/2013/05/how-to-parse-json-string -via-command-line-on-linux.html – Wrikken

+0

Использовать ['sed'] (http://man7.org/linux/man-pages/man1/sed.1.html)? –

+0

Да. Пожалуйста. @Wrikken - ваша ссылка, я считаю, показывает, как разбирать JSON. Здесь мне нужно отредактировать его. – user1107173

ответ

1

В Gnu Awk версии 4 вы можете использовать patsplit(). Попробуйте следующий Баш скрипт:

#! /bin/bash 

IFS=$'\n' ar=(rsids="1 2" clientCode="2" server="3") 
mv file.json file.json.bak 
gawk -va="${ar[*]}" -f a.awk file.json.bak > file.json 

где a.awk является:

BEGIN { 
    n=split(a,b,"\n") 
    for (i=1; i<=n; i++) { 
     split(b[i],z,"=") 
     w[("\""z[1]"\"")]=("\""z[2]"\"") 
    } 
    RS="^$" #Read whole file in a single record 
} 
{ 
    n=patsplit($0,c,/"[^"]*"[[:blank:]]*:[[:blank:]]*"[^"]*"/,s1) 
    printf "%s", s1[0] 
    for (i=1; i<=n; i++) { 
     patsplit(c[i],d,/"[^"]*"/,s2) 
     if (d[1] in w) 
      d[2]=w[d[1]] 
     printf "%s%s%s%s%s%s",s2[0],d[1],s2[1],d[2],s2[2],s1[i] 
    } 
} 

Выход:

{ 
    "version" : "1.0", 
    "analytics" : { 
     "rsids" : "1 2", 
     "charset" : "UTF-8", 
     "ssl" : false, 
     "offlineEnabled" : true, 
     "lifecycleTimeout" : 300, 
     "privacyDefault" : "optedin", 
     "poi" : [] 
    }, 
    "target" : { 
     "clientCode" : "2", 
     "timeout" : 5 
    }, 
    "audienceManager" : { 
     "server" : "3" 
    } 
} 

Редактировать

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

IFS=$'\n' ar=("[email protected]") 

и называют это нравится:

bash$ editJson rsids="1 2" clientCode="2" server="3" 
+0

Спасибо. Есть ли способ передать значения для rsids, clietCode и сервера через командную строку при вызове сценария? – user1107173

+0

@ user1107173 Да, см. Обновленный ответ. –

1

Если у вас есть рубин

require "rubygems" 
require 'json' 
parsed = JSON.parse(File.open("file.json").read) 
puts parsed["analytics"]["rsids"] 
puts parsed["target"]["clientCode"] 
+1

Это не отредактирует файл 'file.json'. Он печатает поля, но не вставляет новые значения для полей обратно в файл. –

Смежные вопросы