首页 > 解决方案 > 如何使用 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

谢谢

标签: perl

解决方案


当这样的事情已经存在时,为什么还要尝试编写自己的 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

推荐阅读