Se você está bem com o uso de perl
$ s='abcTestString : "abc {ccb} bbc",'
$ echo "$s" | perl -Mopen=locale -Mutf8 -F: -lane '
$F[-1]=~s/\{[^{}]+\}(*SKIP)(*F)|[a-z]+/$&=~tr|abc|абц|r/ge;
print join ":",@F'
abcTestString : "абц {ccb} ббц",
-
-Mopen=locale -Mutf8configurações do unicode (graças a essa maravilhosa resposta tr analog para caracteres unicode? ) -
-F: -laneuse:como separador de campo, salvo em@Farray (consulte link para outros opções) -
$F[-1]último campo de@Farray -
\{[^{}]+\}(*SKIP)(*F)|[a-z]+aqui dizemos que[a-z]+porção precisa corresponder, mas\{[^{}]+\}deve ser deixado como está -
$&=~tr|abc|абц|rrealiza a transliteração para a parte correspondente -
geo modificadorgpara substituir todas as correspondências,emodificador para permitir o código Perl na seção de substituição
Se este é um código muito grande para manipular a partir da linha de comando, altere-o para um programa
$ echo "$s" | perl -MO=Deparse -Mopen=locale -Mutf8 -F: -lane '
$F[-1]=~s/\{[^{}]+\}(*SKIP)(*F)|[a-z]+/$&=~tr|abc|абц|r/ge;
print join ":",@F'
BEGIN { $/ = "\n"; $\ = "\n"; }
use open (split(/,/, 'locale', 0));
use utf8;
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
our @F = split(/:/, $_, 0);
$F[-1] =~ s[\{[^{}]+\}(*SKIP)(*F)|[a-z]+][use utf8 ();
$& =~ tr/abc/\x{430}\x{431}\x{446}/r;]eg;
print join(':', @F);
}