如何使用perl按顺序获取匹配
我有+1000个json文件,如下所示:如何使用perl按顺序获取匹配,perl,Perl,我有+1000个json文件,如下所示: ({ "Companies": [ { "company": "COMPANY_1", "time": "20DAYS" }, { "company": "COMPANY_2", "time": "1DAY" }, ] }) 使用perl如何获得这样的输出: COMPANY_1:20DAYS,COMPANY_2:1DAY 我在尝试这个命令 perl -lnE '$
({
"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:20DAYS,COMPANY_2:1DAY
谢谢单向:
#!/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
或任何东西来解析它,而不是使用正则表达式。既然已经存在这样的东西,为什么还要费心编写自己的JSON解析器呢
请注意,您所拥有的不是JSON—您在整个列表中有额外的paren,在列表末尾有额外的逗号—但我们可以补偿这些
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
两个我的数据几乎是但不完全是连续两个不同的人提出的问题?奇怪的但是,这一个不太容易转换成实际的JSON,这不是JSON。JSON文件中不能包含
(
)
。是的,它的JSON文件:)或者您在此处发布的内容与实际文件不匹配,或者您的文件不是JSON。是哪一个?请不要试图自己解析JSON。您可以使用现有的工具来处理它。请参阅CPAN上的JSON模块。是的,我的文件是JSON格式的,我在一个文件夹中有+1000个JSON文件,我想从我的所有JSON文件中获取所需的输出。@DavidBoe然后提供一个原始JSON文件的示例。示例输入包含}、]
,这在JSON中也是无效的。我得到以下错误:开始失败--编译中止。@melpomene,已修复。@DavidBoe,这意味着先前的错误会阻止程序继续。您是否收到一个错误,说您没有安装JSON::XS?@ikegami再次出现相同的错误:BEGIN失败——编译中止。
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