Meu conhecimento em Perl é tênue, mas como ninguém mais forneceu uma resposta em Perl, vou tentar.
Transmita seus dados como arquivos e imprima linhas separadas por tabulações com três valores por linha:
perl -e 'while (<>) { $s .= $_; } chomp $s; @arr = split(/\n{2,}/, $s); foreach my $a(@arr) { $a =~ s/Filename: ([^\n]*)\nType: ([^\n]*)\nSize: ([^\n]*)\n.*/$1\t$2\t$3\n/ || next; print "$a"; } ' infile
Resultado:
XXXXX XXX XXXX
YYYYY YYY YYYY
É um pouco de força bruta, mas funciona dividindo a entrada em parágrafos / blocos e então aplica sua regex multi-linha para cada um.
Detalhes ...
-
while (<>) { $s .= $_; }
- Slurp a entrada em uma única string. -
chomp $s
- Remove a nova linha à direita da string. -
@arr = split(/\n{2,}/, $s)
- Dividir cadeia em consecutivos novas linhas. Isso divide em parágrafos / blocos. Armazene os blocos em uma matriz. -
foreach my $a(@arr)
- Faz um loop sobre cada elemento da matriz (bloco). As próximas duas linhas de código são aplicadas a cada bloco. -
$a =~ s/Filename: ([^\n]*)\nType: ([^\n]*)\nSize: ([^\n]*)\n.*/$1\t$2\t$3\n/ || next
- Extrai valores dos três campos de interesse. Se nenhuma substituição ocorrer (o que significa que o regex não corresponde, porque, por exemplo, um valor está faltando), pule este bloco e vá para o próximo. -
print "$a"
- Imprimir o resultado da substituição: os três valores separados por tabulações.
Mais uma vez, eu não uso muito Perl, então provavelmente há soluções mais elegantes do que isso.