Esse script Perl deve fazer isso. Eu testei no exemplo que você tinha no pastebin e ele funciona como esperado:
#!/usr/bin/env perl
use strict;
my %k; ## This hash will store the target/replacement pairs
## Read the list of replacements
open(my $r,"$ARGV[0]")||die "Couldn't open replacements list\n";
while(<$r>){
chomp;
my @F=split(/\s+/);
$k{$F[0]}=$F[1]
}
close($r);
$/=undef;
open(my $fh, "$ARGV[1]")||die "Couldn't open input file\n";
while(<$fh>){
## Read the entire file at once
$/=undef;
my @F=split(/\x1f/);
## If this exists in the replacements list
if (defined($k{$F[5]})) {
## Modify the 17th field. This will only replace the first
## occurence. Use 's///g' for all.
$F[16]=~s/$F[5]/$k{$F[5]}/;
## Replace the 6th field
$F[5]=$k{$F[5]};
}
## If it doesn't
else {
## Print the file name to STDERR unless the 5th field
## was empty.
print STDERR "Problematic file: $ARGV[1]\n" unless $F[5]=~/^\s*$/;
}
## print each field separated by '0x1f' again.
print join "\x1f",@F;
}
close($fh);
Salve isso como fixidiocy.pl
no diretório $HOME
e cd
no diretório que contém os arquivos de destino. Agora, execute-o em cada arquivo, fornecendo o nome do arquivo e o caminho para o arquivo de substituições como argumentos:
for file in *; do
perl ~/fixidiocy.pl /path/to/replacements "$file" > "$file".fixed
done