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 -Mutf8
configurações do unicode (graças a essa maravilhosa resposta tr analog para caracteres unicode? ) -
-F: -lane
use:
como separador de campo, salvo em@F
array (consulte link para outros opções) -
$F[-1]
último campo de@F
array -
\{[^{}]+\}(*SKIP)(*F)|[a-z]+
aqui dizemos que[a-z]+
porção precisa corresponder, mas\{[^{}]+\}
deve ser deixado como está -
$&=~tr|abc|абц|r
realiza a transliteração para a parte correspondente -
ge
o modificadorg
para substituir todas as correspondências,e
modificador 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);
}