2016-10-22 2 views
0

Некоторые люди отформатируют свои файлы JSON, где все основные элементы данных находятся внутри массива. Я хочу, чтобы элементы массива были объектами json.Как заменить диапазон шаблонов с помощью awk или sed

Другими словами ... Я хочу, чтобы принимать какие-либо общий текстовый файл так:

{ "продукты": [{ "fgid": "Ф.", "fgcat_id": "1", «srvg_sz»: «125 мл, & frac12, чашка, 6 копьев», «еда»: «Спаржа»}, {«fgid»: «vf», «fgcat_id»: «1», «srvg_sz»: «125 мл, & frac12; cup "," food ":" Beans, green "}, {" fgid ":" vf "," fgcat_id ":" 1 "," srvg_sz ":" 125 mL, & frac12, cup cooked "," food " : «Bok choy/Chinese cabbage (Choi sum)»}, {«fgid»: «vf», «fgcat_id»: «1», «srvg_sz»: «125 mL, & frac12; cup», «food»: «Брокколи "}, {" fgid ":" vf "," fgcat_id ":" 1 "," srvg_sz ":" 125 mL, & frac12; cup, 4 sprouts "," food ":" Brussels prouts "}, {" fgid " : «vf», «fgcat_id»: «2», «srvg_sz»: «125 mL, & frac12; cup, 1 large», «food»: «Carrots»}]}

и найти замену диапазона текста от первого «{» к первым «[» и просто заменить его «{{», и (в отдельной команде?) В конце заменить "]", так что это выглядит следующим образом:

{{ "fgid": "Ф.", "fgcat_id": "1", "srvg_sz": "125 мл, & frac12; чашка, 6 копьев »,« еда »:« Спаржа »}, {« fgid »:« vf »,« fgcat_id »:« 1 »,« srvg_sz »:« 125 mL, & frac12; чашка "," еда ":" Бобы, зеленые "}, {" fgid ":" vf "," fgcat_id ":" 1 "," srvg_sz ":" 125 mL, & frac12; чашка приготовленная »,« еда »:« Бок чой/китайская капуста (сумма Чой) »}, {« fgid »:« vf »,« fgcat_id »:« 1 »,« srvg_sz »:« 125 mL, & frac12; чашка "," еда ":" Брокколи "}, {" fgid ":" vf "," fgcat_id ":" 1 "," srvg_sz ":" 125 mL, & frac12; чашка, 4 ростки "," еда ":" Брюссельская капуста "}, {" fgid ":" vf "," fgcat_id ":" 2 "," srvg_sz ":" 125 mL, & frac12; чашка, 1 большая »,« еда »:« Морковь »}}

Но я хотел бы, чтобы это было для любого подобного файла, поэтому я не знаю длины текста« продуктов »(или иногда там это другие элементы перед массивом, которые я также хочу уничтожить до первого «[» начинается]. Это поможет мне разобраться с Open Data от канадского правительства, поскольку все JSON находятся в одном объекте в массиве. . был бы рад использовать любой СЭД или AWK

+1

Если все они строковые, попробуйте 'sed 's/^ [^ [] * \ [/ {/; s/\]} $ /}/'file' – Sundeep

+0

Является ли последний последним JSON? Тем не менее - почему бы просто не использовать парсер JSON? – Sobrique

+0

@Sobrique Я просто хочу вынести из массива, поэтому, если я импортирую в монго или переосмыслить, они получают идентификаторы объектов – 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

"unterminited substitute pattern". Я использую OSX, если это имеет значение. – Narwhal

+0

Хотя этот код может помочь решить проблему, он не объясняет _why_ и/или _how_, он отвечает на вопрос. Предоставление этого дополнительного контекста значительно улучшит его долгосрочную образовательную ценность.Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, включая ограничения и допущения. –

Смежные вопросы