2016-10-22 67 views
0

有些人將其所有主要數據元素都放在數組中的JSON文件格式化。我想將數組元素提升爲json對象。如何使用awk或sed替換模式範圍

換句話說......我想採取任何普通的文本文件是這樣的:

{ 「食品」:[{ 「FGID」: 「VF」, 「fgcat_id」: 「1」, 「srvg_sz」:「125mL,杯,6支矛」,「食物」:「蘆筍」},{「fgid」:「vf」,「fgcat_id」:「1」,「srvg_sz」 frac12; cup「,」food「:」Beans,green「},{」fgid「:」vf「,」fgcat_id「:」1「,」srvg_sz「:」125mL,½ cup cooked「 :「Bok choy /大白菜(Choi sum)」},{「fgid」:「vf」,「fgcat_id」:「1」,「srvg_sz」:「125毫升,杯子」,「食物」:「西蘭花「},{」fgid「:」vf「,」fgcat_id「:」1「,」srvg_sz「:」125毫升,杯子,4個豆芽「,」食物「:」抱子甘藍「},{」fgid「 :「vf」,「fgcat_id」:「2」,「srvg_sz」:「125mL,&cup,1 large」,「food」:「胡蘿蔔」}]}

和找到替換文本範圍內的第一「{」第一「[」,只是替換爲「{{」,並且(在一個單獨的命令?)在末端取代「]」,所以,它看起來像這樣:

{{ 「FGID」: 「VF」, 「fgcat_id」: 「1」, 「srvg_sz」:「125毫升,½杯,6矛「,」食物「:」蘆筍「},{」fgid「:」vf「,」fgcat_id「:」1「,」srvg_sz「:」125毫升,½杯子「,」食物「:」豆類,綠色「},{」fgid「:」vf「,」fgcat_id「:」1「,」srvg_sz「:」125mL,½杯子熟「,」食物「:」白菜/大白菜(Choi sum)「},{」fgid「:」vf「,」fgcat_id「:」1「,」srvg_sz「:」125mL,½杯子「,」食物「:」西蘭花「},{」fgid「:」vf「,」fgcat_id「:」1「,」srvg_sz「:」125mL,½杯子,4芽菜「,」食物「:」布魯塞爾豆芽「},{」fgid「:」vf「,」fgcat_id「:」2「,」srvg_sz「:」125mL,½杯,1個大」,‘食品’:‘胡蘿蔔’}}

但我想這是對任何類似文件,所以我不知道的長度‘食品’的文字(或有時有是陣列之前的其他元素,我也想在第一個「[」開始之前消滅它)。這將幫助我處理來自加拿大政府的Open Data,因爲所有的JSON都在一個數組中的一個對象中,謝謝。 。會很樂意爲使用awk或者sed

+1

如果它們全部是一行一行,請嘗試'sed's/^ [^ [] * \ [/ {/; s/\]} $ /} /'file' – Sundeep

+0

是後者有效的JSON嗎?即使如此 - 爲什麼不使用JSON解析器呢? – Sobrique

+0

@Sobrique我只想取出數組,所以如果我導入到mongo或重新思考他們得到對象ID – Narwhal

回答

1

像這樣的事情就可以了,我認爲:

#!/usr/bin/env perl 

use strict; 
use warnings; 
use JSON; 
use Data::Dumper; 

my $json_str = 
    '{"foods":[{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL, ½ cup, 6 spears","food":"Asparagus"},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL, ½ cup","food":"Beans, green"},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL, ½ cup cooked","food":"Bok choy/Chinese cabbage (Choi sum)"},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL, ½ cup","food":"Broccoli"},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL, ½ cup, 4 sprouts","food":"Brussels sprouts"},{"fgid":"vf","fgcat_id":"2","srvg_sz":"125 mL, ½ cup, 1 large","food":"Carrots"}]}'; 

my $json_obj = from_json($json_str); 
print Dumper \$json_obj; 
my $json_arr = $json_obj -> {foods}; 
print to_json ($json_arr, { pretty => 1 }); 

實際上,我相當肯定你的第二個例子實際上並不是有效的JSON,因爲你不能使用[]來做'排序數組'。

0

試試這個 -

sed -e '1s/{/{{/' -e '$s/\(.*\)]/\1/' 

下面的解釋是: -e時使用了多個SED操作 1S是選擇第一行 $ S是選擇最後一行 (。*)]/\ 1是要替換上次出現的[。

+0

「未終止的替代模式」。如果有問題,我正在使用OSX。 – Narwhal

+0

雖然這段代碼可能有助於解決問題,但它並沒有解釋_why_和/或_how_它是如何回答問題的。提供這種附加背景將顯着提高其長期教育價值。請[編輯]您的答案以添加解釋,包括適用的限制和假設。 –