如何使用Perl顺序获取匹配项

时间:2019-04-29 17:22:26

标签: perl

我有+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

谢谢

2 个答案:

答案 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或其他任何方法来解析它,而不要使用正则表达式。