我试图匹配yaml文件的子部分。在此示例中,ab
:
输入:
a:
aa:
- aaa
ab:
- aba
- abb
ac:
- aca
输出:
aba abb
我已经尝试过了。像
#!/usr/bin/perl -00 -wnl
/a:ab:[ \t]*\n([ \t]+-[ \t]+(\w+)[ \t]*\n)/sg and printf "$2";
但这仅提供aba
。
答案 0 :(得分:2)
使用正则表达式进行操作是一个坏主意,出于同样的原因,尝试“做”和“做”是不好的。带正则表达式的XML。 YAML是一种上下文标记语言,正则表达式不做上下文。因此,你注定要失败 - 充其量你会制造一些破旧的脆弱代码。
只需使用解析器。 YAML有很多。
例如:YAML
:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
use YAML;
my $yaml = Load(do { local $/; <DATA> } );
print Dumper \$yaml;
print join "\n", @{$yaml->{a}{ab}},"\n";
__DATA__
a:
aa:
- aaa
ab:
- aba
- abb
ac:
- aca
答案 1 :(得分:1)
我认为这是玩,好奇,因为你要求正则表达式。对于任何严重的事情,请使用众多模块中的一个来解析任何此类(不规则)结构。请不要使用正则表达式。
那说,回答直接问题
perl -0777 -nE '/ab:[^-]+\-\s+(\w+)[^-]+\-\s+(\w+)/gs; say "$1 $2"' data.txt
在data.txt
文件中发布的数据会打印
aba abb
这当然是针对您的具体数据。一旦你开始调整它以获得更多通用数据集,你就会很快看到为什么不使用正则表达式。