我有+1000个json文件,如下所示:
({
"Companies": [
{
"company": "COMPANY_1",
"time": "20DAYS"
},
{
"company": "COMPANY_2",
"time": "1DAY"
},
]
})
使用perl我怎么能得到这样的输出:
COMPANY_1:20DAYS,COMPANY_2:1DAY
尝试此命令
perl -lnE '$x = (split /=/,$ARGV)[4], say "$x:", join ",", /(?<="company":")[^"]*/g,/(?<="time":")[^"]*/g' file.txt
但是我得到这样的输出:
COMPANY_1,COMPANY_2,1DAY,20DAYS
所需的输出:
COMPANY_1:20DAYS,COMPANY_2:1DAY
谢谢
答案 0 :(得分:2)
为什么这样的事情已经存在,为什么还要尝试编写自己的JSON解析器呢?
请注意,您拥有的不是JSON,而是在列表的末尾加上了逗号,但是我们可以弥补这些不足。
perl -MJSON::XS -CS -0777ne'
BEGIN { $j = JSON::XS->new->relaxed(1) }
s/^\(//; s/\)\z//;
CORE::say
join ",",
map { join ":", $_->{company}, $_->{time} }
@{ $j->decode($_)->{Companies} }
' *.json
答案 1 :(得分:1)
一种方法:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use List::Util qw/pairs/;
my $str = q/"company": "COMPANY_1","time": "20DAYS","company": "COMPANY_2","time": "1DAY",/;
my @pairs = $str =~ m/"company" \s* : \s* "([^"]+)" \s* ,
"time" \s* : \s* "([^"]+)"/gx;
my @output;
for my $pair (pairs @pairs) {
push @output, join(':', @$pair);
}
say join(',', @output);
但是,如果您的原始数据实际上是JSON,则出于某种原因,您将从其中删除了{}
和[]
。最好坚持使用原始数据并使用JSON::XS
或其他任何方法来解析它,而不要使用正则表达式。