Com relação aos exemplos de entrada acima, o script pode ser:
sed s/[^\"\']*[^0-9]\]{\(.*\)}// <<\END
"[]{foo bar 1}"
"[abc]{foo bar 2}"
"[]{foo[3]{xyz} bar 3}"
"[]{foo $sq[3]{xyz}$ bar 4}"
"[goo{w}]{foo $sq[3]{xyz}$ bar 5}"
"[goo[3]{w}]{foo $sq[3]{xyz}$ bar 6}"
"[goo[3]{w} hoo[3]{5}]{foo $sq[3]{xyz}$ bar 7}"
END
produz
"foo bar 1"
"foo bar 2"
"foo[3]{xyz} bar 3"
"foo $sq[3]{xyz}$ bar 4"
"foo $sq[3]{xyz}$ bar 5"
"foo $sq[3]{xyz}$ bar 6"
"foo $sq[3]{xyz}$ bar 7"
Outra coisa é a sua função, que pode ser simplificada:
function RemoveInitialSquareBraces {
printf '%s\n' "$@" |
sed ...
}
assim aceitará muitos argumentos.
Atualizar : para casos mais gerais, você pode realizar a tarefa em duas etapas:
sed -e "
s/\[.*\[.*\][^[]*\]/[]/ #remove square brackets inside square brackets
s/\[[^]]*\]{\(.*\)\}// #lazy strip square brackets and curle brackets
"
Adição : você pode usar perl- grep (GNU grep com extensão de perl):
grep -Po '\[([^][]*\[\w+\][^][]*)*\]{\K.*(?=})'
ou sed com o mesmo regexp:
sed 's/\[\([^][]*\(\[\w\+\][^][]*\)*\)*\]{\(.*\)}//'