Вот скрипт на Perl, который выдает желаемый результат.
#!/usr/bin/perl
use warnings;
use strict;
use feature qw/postderef/;
no warnings qw/experimental::postderef/; # Suppress warning on 5.20 and 5.22
use YAML::XS qw/LoadFile/;
use Text::CSV_XS;
my $yaml = LoadFile($ARGV[0]);
my $csv = Text::CSV_XS->new({quote_space => 1, eol => "\n"});
for my $schema ($yaml->{'schemas'}->@*) {
for my $table ($schema->{'tables'}->@*) {
for my $col ($table->{'columns'}->@*) {
my @row = ("$table->{name}.$col->{name}", $col->{type});
push @row, $col->{'description'} if exists $col->{'description'};
$csv->print(\*STDOUT, \@row);
}
}
}
Пример:
$ perl example.pl test.yaml
sugar.color,abcd
sugar.taste,abcd,xyz
sugar.structure,abcd,xyzasaa
salt.strength,abcdef,"easy to find"
salt.color,abcdeffa,"not sweet"
salt.quality,abcd,"how much is needed"
Требуется пара нестандартных модулей: YAML :: XS (пакет Debian / Ubuntu libyaml-libyaml-perl
) и Текст :: CSV_XS (Debian / Ubuntu libtext-csv-xs-perl
)
YAML - это формат разметки структурированных данных, и попытка сделать что-то с ним по одной строке за раз с помощью регулярных выражений или тому подобного настраивает себя на неудачу; любой ввод, который отличается от того, что вы ожидаете, приведет к его сбою; и отсутствие контекста в более широкой картине и множество крайних случаев делают невозможным быть надежным. То же самое для попытки анализа таких вещей, как CSV, XML / HTML или JSON с регулярными выражениями.
Вам лучше использовать инструмент или библиотеку, которая понимает формат. Таким образом, приведенное выше использует синтаксический анализатор YAML для преобразования вашего файла в эквивалентную структуру данных perl, а затем проверяет это, распечатывая соответствующие значения. Он использует библиотеку CSV для форматирования вывода, чтобы избежать необходимости вручную обрабатывать поля кавычек с пробелами, как это делает желаемый вывод, и все другие крайние случаи, такие как кавычки в полях.