2014-02-24 108 views
0

这是一个有点以.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实现这一点,无论是从提示或者来自一小段代码。

+1

那岂不是更容易映射到JSON对象(OOP语言),并从那里走? – hovanessyan

+2

用于Linux的命令行工具结算 - jsawk - https://github.com/micha/jsawk和JQ - HTTP://stedolan.github。io/jq/tutorial/ – hovanessyan

回答

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记录},。然后,每个单独的记录被分割的上一个组合“:,字符与任选的闭合。然后我们只在某一日期之后输出该行。

1月1日2013年

后这将找到所有记录

编辑:

第二届AWK将每个单独的JSON记录到使用开始子字符串键值对,后跟一个,和一个可选的结局。 所以,在你的榜样,将分割在任“”‘:’“:

所有奇数场是关键,且所有偶数场都值(因此4 $正在日期。你的例子)。然后,我们检查,如果$ 4(日期)为2013-01-01以后。

我发现我上犯了一个错误的可选(应遵循,而不是*)在拆分,我现在已经纠正,我也用printf函数来显示值。

+0

谢谢,这对我来说足够好,可以得到我需要的东西。你向我解释第二行,但是......在|之后 – Alichino

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 

我找不出什么输出应该是;如果你可以更具体,我可以调整我的例子。

+0

我需要在cygwin中运行Python脚本?输出应该是:[date]:“[bank-holiday-title],bunting/no bunting。Thx – Alichino

+0

Wow,在cygwin问题中标记'unix',这很奇怪;-)但是没关系。当然,在Unix系统上,这通常是预先安装的,但是在Windows世界中可能会有更好的选择(我在你的问题中加了一个cygwin标签。) – Alfe

相关问题