Embora você possa fazer esse tipo de coisa envolvendo as ferramentas Unix mais primitivas - grep
, sed
, awk
, etc. - em um script de shell, esse tipo de problema realmente deseja ser tratado linguagem de programação completa que possui um poderoso sistema de expressão regular. Pessoalmente, eu procuraria por Perl:
#!/usr/bin/perl -w
use strict;
my $line = 0;
my ($junk, $color, $number);
open my $data, '<', 'data.txt' or die "open: $!\n";
while (<$data>) {
chomp;
++$line;
if (m/Land/) {
print "color=L, number=0\n";
}
else {
($junk, $color, $number) = m/, (\d+)?([WURBG]+) \((\d+)\)$/;
if (defined $color and defined $number) {
$color = 'M' if length($color) > 1;
print "color=$color, number=$number\n";
}
else {
($junk, $number) = m/, (\d+)? ?\((\d+)\)$/;
if (defined $number) {
print "color=C, number=$number\n";
}
else {
print "Line #$line is malformed!\n";
}
}
}
}
data.txt
contém isto:
Sorcery, R (1)
Creature — Beast 5/3, 4G (5)
Sorcery, 1WWU (4)
Legendary Land
Artifact, (0)
Legendary Creature — Eldrazi 15/15, 15 (15)
Há apenas uma diferença em relação ao que você postou: a linha "Artefato" em sua pergunta não tem parênteses em torno do valor 0, o que exigiria que uma exceção fosse feita no analisador. Isso pode ser adicionado, mas não vejo por que é melhor do que corrigir o formato do arquivo de dados.
Suponho que você não queira simplesmente que os valores de cores e números sejam impressos, como esse script faz. Você colocaria seu próprio código em cada uma das print
linhas.
O $junk
vem da minha suposição de que o dígito antes da (s) letra (s) colorida (s) pode ser significativo. Eu estou usando isso para ajudar o parser a fazer o que ele quer. Se você tiver um uso real para esse dígito, poderá renomear a variável $junk
para ter significado semântico. É apenas "lixo" para mim, porque não sei o que o valor significa.