在文件中的两个字符串之间查找字符串

时间:2014-02-24 14:59:43

标签: json string bash unix cygwin

这是我需要查找信息的.json文件:

"title":
"Spring bank holiday","date":"2012-06-04","notes":"Substitute day","bunting":true},
{"title":"Queen\u2019s Diamond Jubilee","date":"2012-06-05","notes":"Extra bank holiday","bunting":true},
{"title":"Summer bank holiday","date":"2012-08-27","notes":"","bunting":true},
{"title":"Christmas Day","date":"2012-12-25","notes":"","bunting":true},
{"title":"Boxing Day","date":"2012-12-26","notes":"","bunting":true},
{"title":"New Year\u2019s Day","date":"2013-01-01","notes":"","bunting":true},
{"title":"Good Friday","date":"2013-03-29","notes":"","bunting":false},
{"title":"

文件更长,但它是一长串文字。

我想显示某个日期之后的银行假日,以及它是否涉及彩旗。 我试过grep和sed,但我无法弄明白。 我想要这样的事情:

[command] between [date] and [}] display [title] and [bunting]/[no bunting]

[title]应该只是“圣诞节”或其他什么

忘记提及: 我想在bash shell中实现这一点,无论是从提示还是从一小段代码。

2 个答案:

答案 0 :(得分:2)

你应该在一个不错的编程语言中使用一个合适的JSON解析器,然后你可以在没有太多代码的情况下以安全的方式做很多工作。这个小Python代码怎么样:

#!/usr/bin/env python

import json

with open('my.json') as jsonFile:
  holidays = json.load(jsonFile)
for holiday in holidays:
  if holiday['date'] > '2012-05-06':
    print holiday['date'], ':', holiday['title'], \
          ("bunting" if holiday['bunting'] else "no bunting")
  break  # in case you only want one line of output

我无法弄清楚输出应该是什么;如果你可以更具体,我可以调整我的例子。

答案 1 :(得分:1)

您可以尝试使用awk:

 awk -F"}," '{for(i=1;i<=NF;i++){print $i}}' file.json | awk -F"\"[:,]\"?" '$4>"2013-01-01"{printf "%s:%s:%s\n" ,$2,$4,$8}'

看到json文件是一个长字符串,我们首先将此行拆分为},上的多个json记录。然后将每个单独的记录拆分为“:,字符与可选结束的组合。然后我们只在特定日期之后输出该行。

这将在2013年1月1日之后找到所有记录。

修改

第二个awk使用以开头的子字符串将每个单独的json记录拆分为键值对,然后是,< / strong>,以及可选的结尾。 因此,在您的示例中,它将分为“,”“:”“:

所有奇数字段都是键,所有偶数字段都是值(因此$ 4是您示例中的日期)。然后我们检查$ 4(日期)是否在2013-01-01之后。

我注意到我在可选的(后面应该跟而不是*)的错误中,我现在已经纠正了分割,我也使用了printf用于显示值的功能。