如何在BASH中删除Json对象

时间:2017-03-03 22:46:39

标签: json bash gawk

我有几个Json对象,如果这个Json包含特定信息,我需要删除其中一个。举个例子,我需要删除Json对象的状态是否为RUNNING。

INPUT

projects {
   key: "ads_evenflow.opt"
   value {
      name: "ads_evenflow.opt"
      state: COMPLETE
      result: PASSED
     }
 }
projects {
    key: "alexandria.opt"
    value {
      name: "alexandria.opt"
      state: RUNNING
      result: PASSED
    }
 }
    projects {
        key: "android.opt"
        value {
           name: "android.opt"
          state: COMPLETE
           result: PASSED
        }
  }

输出

  projects {
   key: "ads_evenflow.opt"
   value {
      name: "ads_evenflow.opt"
      state: COMPLETE
      result: PASSED
     }
  }
   projects {
        key: "android.opt"
        value {
           name: "androids.opt"
          state: COMPLETE
           result: PASSED
        }
  }

1 个答案:

答案 0 :(得分:0)

您的结构不是有效的SharedPreferences mobilePreference = this.getSharedPreferences("in.bhartisoftwares.amit.allamitappsthree", Context.MODE_PRIVATE); mobilePreference.edit().remove("mobileString").commit(); 。对于此类结构,您需要更多宽松的解析器。幸运的是,JSONY perl模块可以解析它。来自doc

  

JSONY是一种类似于JSON的数据语言,只是更加寒冷。所有   有效的JSON也是有效的JSONY(并代表同样的事情   但是,JSONY允许你省略许多使JSON成为的语法   写作很痛苦。

以下perl代码可以满足您的需求。

JSON

打印:

#!/usr/bin/env perl
use 5.014;
use warnings;
use JSONY;

my $string = slurp_file();
my $data = JSONY->new->load( $string );
for my $proj (@{$data}) {
    next unless ref($proj);
    next if $proj->{value}->{state} eq 'RUNNING';
    pretty_print_proj($proj);
}

sub pretty_print_proj {
    my $p = shift;
    say "project {";
        say qq{\tkey: "$p->{key}"};
        say "\tvalue {";
            say "\t\t$_: ", $p->{value}->{$_} for (qw(name state result));
        say "\t}";
    say "}";
}

sub slurp_file {
    #change this for your real case...
    return do { local $/; <DATA>};
}

__DATA__
projects {
   key: "ads_evenflow.opt"
   value {
      name: "ads_evenflow.opt"
      state: COMPLETE
      result: PASSED
     }
 }
projects {
    key: "alexandria.opt"
    value {
      name: "alexandria.opt"
      state: RUNNING
      result: PASSED
    }
 }
    projects {
        key: "android.opt"
        value {
           name: "android.opt"
          state: COMPLETE
           result: PASSED
        }
  }