使用awk / sed解析类似JSON的文件的最佳方法

时间:2014-04-30 19:38:10

标签: json bash parsing awk sed

我有一个文件,内容如下:

{application_name, [
    {settings, [
        {generic_1, [
            {key_1, "value"},
            {key_2, 1},
            {key_3, [something, other]}
        ]},
        {generic_2, [
            {key_1, "value"},
            {key_3, [something, other]}
        ]},
        {{generic_2, specific_1}, [
            {key_3, [entirely, different]}
        ]},
    ]}
]}

现在我正在寻找一种使用awk或sed(或其他东西)解析它的方法。我需要的是能够指定一个键,然后得到" blockname"返回。

f.e。如果我希望key_3的所有设置都返回如下:

generic_1 [something, other]
generic_2 [something, other]
specific_1 [entirely, different]

最好的方法是什么?

2 个答案:

答案 0 :(得分:8)

如何使用sed或awk解析JSON数据的最佳解决方案是......不要使用sed或awk这样做。它们不是为它而设计的。

使用了解JSON的工具,如

  1. perl的
  2. 红宝石
  3. 的javascript
  4. jq
  5. 其他任何事情
  6. 在此基础上使用sedawk这样的内容将会很脆弱(充其量)。

答案 1 :(得分:0)

我同意Etan的说法,这是另一种工具的工作 这是gnu awk方法(由于RS中有多个字符),而不是完整的解决方案。

awk -v RS="generic_[0-9]" 'NR==1 {f=RT;next} {$1=$1;n=split($0,a,"[][]");if (a[1]~/}/) {split(a[1],b,"[ }]");f=b[2]};printf "%s [",f;for (i=1;i<=n;i++) if (a[i]~/key_3/) print a[i+1]"]";f=RT}' file
generic_1 [something, other]
generic_2 [something, other]
specific_1 [entirely, different]

或者更具可读性:

awk -v RS="generic_[0-9]" '
NR==1 {
    f=RT
    next} 
    {
    $1=$1
    n=split($0,a,"[][]")
    if (a[1]~/}/) {
        split(a[1],b,"[ }]")
        f=b[2]}
    printf "%s [",f
    for (i=1;i<=n;i++)
        if (a[i]~/key_3/)
            print a[i+1]"]"
            f=RT
    }' file