O seguinte comando sed parece funcionar:
sed 's/{{\([^*[a-z][^}]*\)}}/{{\}}/g;s/{{\${\([^}]*\)}}}/{{$\{\}}}/g'
Explicação:
-
{{\([^*[a-z][^}]*\)}}
encontra{{stuff}}
, exceto quandostuff
começ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 quefoo
ebar
não contêm}
. - E substitui por
{{foo\{bar}}
. (Nota{{xxx{yyy}}}
é tratado ok.) - Em seguida,
\({{[^}]*\)}}}
encontra{{baz}}}
, em quebaz
não contém}
. - E substitui por
{{baz\}}}
.
foo
, bar
e baz
podem estar vazios, portanto, por exemplo, {{}}}
é convertido em {{\}}}
, conforme necessário.