2016-05-13 67 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

然而它回答op的問題,不是嗎? – bipll

+0

如果他們有nes在他們的數據中提供對象。 – ThisSuitIsBlackNot

-1

您可以用搜索做手工和替換工具。 例如: 搜索:「} {」 替換爲「}^p {」(在Word^p是新行)