用于yaml文件的Perl多行正则表达式

时间:2016-05-24 08:22:05

标签: regex perl yaml

我试图匹配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

2 个答案:

答案 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

这当然是针对您的具体数据。一旦你开始调整它以获得更多通用数据集,你就会很快看到为什么不使用正则表达式。