我需要连接多个JSON文件,所以
...
"tag" : "description"
}
]
[
{
"tag" : "description"
...
进入这个:
...
"tag" : "description"
},
{
"tag" : "description"
...
所以我需要用] [
替换模式,
,但新行字符会让我发疯...
我使用了几种方法,我列出了一些方法:
SED
sed -i '/]/,/[/{s/./,/g}' file.json
但是我收到了这个错误:
sed: -e expression #1, char 16: unterminated address regex
我试图删除所有换行符 following this example
sed -i ':a;N;$!ba;s/\n/ /g' file.json
并且输出文件具有" ^ M"。虽然我在unix中修改了这个文件,但我在这个文件上使用了dos2unix命令,但没有任何反应。然后我尝试将特殊角色包括在内#" ^ M"在搜索上但结果更糟
的Perl (按照提议here)
perl -i -0pe 's/]\n[/\n,/' file.json
但是我收到了这个错误:
Unmatched [ in regex; marked by <-- HERE in m/]\n[ <-- HERE / at -e line 1.
答案 0 :(得分:2)
我想连接几个JSON文件。
如果我理解正确,你会有以下内容(其中字母代表有效的JSON值):
to_combine/file1.json: [a,b,c]
to_combine/file2.json: [d,e,f]
从那以后,您需要以下内容:
combined.json: [a,b,c,d,e,f]
您可以使用以下方法实现此目的:
perl -MJSON::XS -0777ne'
push @data, @{ decode_json($_) };
END { print encode_json(\@data); }
' to_combine/*.json >combined.json
关于Perl解决方案的问题:
[
在正则表达式模式中具有特殊含义。你需要逃脱它。-0
实际上并没有启用slurp模式。使用-0777
。修正:
cat to_combine/*.json | perl -0777pe's/\]\n\[/,\n/g' >combined.json
答案 1 :(得分:1)
请注意,组合多个JSON文件的更好方法是将它们全部解析,组合解析后的数据结构,然后重新编码结果。只需将][
的所有匹配项更改为逗号,
,即可更改数据而非标记
sed是一个最小程序,一次只能在一行文件上运行。 Perl包含了sed或awk将要做的所有事情以及更多的事情,所以我建议你坚持下去
要将]...[
中的所有file.json
对(可能由空格分隔)更改为单个逗号,请使用此
perl -0777 -pe "s/\]\s*\[/,/g" file.json > file2.json
-0
选项指定八进制行分隔符,并为其赋值777使perl立即读取整个文件
单行是着名的无法理解,我总是喜欢一个合适的程序文件,看起来像这样
use strict;
use warnings 'all';
my $data = do {
local $/;
<>;
}
$data =~ s/ \] \s* \[ /,/gx;
print $data;
你可以将其作为
运行perl join_brackets.pl file.json > joined.json
答案 2 :(得分:0)
我在你的问题中尝试了一些例子。
$ sed -rn '
1{$!N;$!N}
$!N
/\s*}\s*\n\s*]\s*\n\s*\[\s*\n\s*\{\s*/M {
s//\},\n\{/
$!N;$!N
}
P;D
' file
...
"tag" : "description"
},
{
"tag" : "description"
...
...
"tag" : "description"
},
{
"tag" : "description"
...