Usando perl
e pré-compilando as expressões regulares para eficiência (não muito importante com apenas 2 padrões de pesquisa e substituição, mas muito útil se houver centenas ou milhares):
#!/usr/bin/perl
use strict;
my %rep=(); # hash for storing search patterns with their replacements
my @rep=(); # array for storing search patterns in the order they were seen.
# first arg is the replacement file
my $replacements_file = shift;
open(REP,'<',$replacements_file) || die "Couldn't open $replacements_file: $!\n";
while(<REP>) {
chomp;
my ($s, $r) = split / \| /;
my $search = qr/$s/; # precompile the regex
$rep{$search} = $r; # store the search regex and its replacement in a hash
push @rep, $search; # use an indexed array to remember the order the patterns
# were read in.
};
close(REP);
# main loop: process remaining args and/or stdin, apply each
# search and replace to every input line.
while(<>) {
foreach my $s (@rep) {
s/$s/$rep{$s}/;
};
print
}
Exemplo de saída:
$ ./replace.pl FileB.txt FileA.txt
1string, 3269
asdf, 8635
ghjk, 8534
foo, 4179
foo, 23490
Aviso: se o mesmo padrão de pesquisa aparecer mais de uma vez, somente o último será armazenado e usado. A maneira mais fácil de evitar essa limitação é armazenar os padrões de pesquisa e suas substituições correspondentes em dois arrays separados:
#!/usr/bin/perl
use strict;
my (@srch, @reps)=();
my $replacements_file = shift;
open(REP,'<',$replacements_file) || die "Couldn't open $replacements_file: $!\n";
my $count=0;
while(<REP>) {
chomp;
my ($s, $r) = split / \| /;
$srch[$count] = qr/$s/;
$reps[$count] = $r;
$count++;
};
close(REP);
$count--;
while(<>) {
foreach my $i (0..$count) {
s/$srch[$i]/$reps[$i]/;
};
print
}
Não é necessário um hash nesta versão, então usei dois arrays.
@srch
para manter os padrões de pesquisa e @reps
para manter as sequências de substituição.