O seguinte comando sed parece funcionar:
sed 's/{{\([^*[a-z][^}]*\)}}/{{\}}/g;s/{{\${\([^}]*\)}}}/{{$\{\}}}/g'
Explicação:
-
{{\([^*[a-z][^}]*\)}}encontra{{stuff}}, exceto quandostuffcomeça com*ou[ou uma letra minúscula. - Substitua por
{{\stuff}}. - Em seguida,
{{\${\([^}]*\)}}}encontra{{\${junk}}}. - E substitui por
{{$\{junk\}}}.
Editar : Uma solução alternativa, após esclarecimento do OP, poderia ser esta:
sed 's/\({{[^}]*\){\([^}]*}}\)/\{/g;s/\({{[^}]*\)}}}/\}}}/g'
Como todos sabemos, o sed não pode fazer a análise recursiva, mas isso deve funcionar para a maioria dos casos simples.
Explicação:
-
\({{[^}]*\){\([^}]*}}\)encontra{{foo{bar}}, em quefooebarnão contêm}. - E substitui por
{{foo\{bar}}. (Nota{{xxx{yyy}}}é tratado ok.) - Em seguida,
\({{[^}]*\)}}}encontra{{baz}}}, em quebaznão contém}. - E substitui por
{{baz\}}}.
foo , bar e baz podem estar vazios, portanto, por exemplo, {{}}} é convertido em {{\}}} , conforme necessário.