2016-05-13 5 views
2

У меня есть текстовый файл, который содержит большое количество объектов JSON, и он не был создан с новыми строками или любым разделителем между объектами.Perl вставить новую строку между каждым} {match

В настоящее время я использую:

perl -e '$/ = "}{"; print "$_\n" while <>' file.txt > out.txt 

Но это вызывает искаженные данные, когда файл разбивается на новой строке объекты JSON будет отсутствовать открытие { в качестве новой линии получает ставится после { характера.

Есть ли способ вставить новую замену линии между совпадением }{, таким как }\n{.

Файл довольно большой, поэтому я не могу его вручную сделать.

Не обязательно находиться в Perl, может быть в чем-то более подходящем для задачи.

+0

Не могли бы вы разместить несколько примеров ввода для целей тестирования? –

+0

Также, как часто вам нужно это делать? Будет ли функция редактора кода или плагин делать трюк? Eclipse и Sublime Text могут это сделать; Скорее всего, Notepad ++ и другие. –

+1

Вопрос в том, что действительно? json_xs так не думает ... 'cat json.json | json_xs -f json -t json-pretty' дает 'мусор после объекта JSON, при смещении символов 13 (до" {"bar": "baz"} {"bo": "...") в/home/foo/... ' – simbabque

ответ

7

Не просто print. Подставьте новую линию между } и {. while нуждается в блоке, потому что последний s/// не работает, поэтому s/// && print while <> не работает.

$ cat json.json 
{"foo":"bar"}{"bar":"baz"}{"bo":"shizzle"} 
$ perl -e '$/ = "}{"; while (<>) { s/\}\{$/}\n{/; print; }' json.json 
{"foo":"bar"} 
{"bar":"baz"} 
{"bo":"shizzle"} 
1
$ cat in.json 
{"a":"b","c":"d"}{"e":"f","g":"h"} 

$ perl -MJSON::XS -0777ne' 
    my $parser = JSON::XS->new->utf8; 
    $parser->incr_parse($_); 
    while (my $obj = $parser->incr_parse()) { 
     print($parser->encode($obj), "\n"); 
    } 
' in.json 
{"c":"d","a":"b"} 
{"e":"f","g":"h"} 
-1
$ echo '{"a", "b", "c"}{42, "omg", "nyan"}{"no", "please", "stop"}' | perl -e '$/ = "}"; $\ = "}\n"; chomp and print while <>' 
{"a", "b", "c"} 
{42, "omg", "nyan"} 
{"no", "please", "stop"} 
+0

Это не работает с вложенными объектами, например '{" foo ": {" bar ":" baz "}}'. Кроме того, ваши примеры (например, '{ «a», «b», «c»} ') недействительны JSON. – ThisSuitIsBlackNot

+0

Но он отвечает на вопрос оп, не так ли? – bipll

+0

Нет, если у них нет в своих данных. – ThisSuitIsBlackNot

-1

Вы можете сделать это вручную с помощью поиска и замены инструмента. Пример: Поиск: "} {" Заменить на "}^p {" (в Word^p новая строка)