sed '/\[/,/\]/s/"",""/,/'
Isso procuraria uma linha com um [ , depois uma linha com ] e, entre essas linhas, substituiria o primeiro "","" encontrado em cada linha. Realmente não olha para onde o [..] está dentro de uma linha.
Como tentativa de ordem zero, algo assim:
$ cat x
"01","5","Male","[""No.**"",""**kg""]","","",""
$ sed 's/\(\[.*\)"",""\(.*\]\)/,/g' x
"01","5","Male","[""No.**,**kg""]","","",""
O padrão corresponde a [ , qualquer coisa, "","" , qualquer coisa e ] , enquanto captura todos menos o "","" para poder juntar as peças novamente.
Isso quebrará para coisas como [..],"","",[..] (onde os colchetes se fecham antes de um "","" ser visto, o padrão procura as seguintes ] ) e [.."","".."",""..] (com várias sequências "","" dentro dos colchetes, apenas um é removido).
Um pouco mais genérica com Perl, apesar de ser um truque horrível de substituição dentro de uma substituição. Você provavelmente deve usar um analisador adequado:
$ cat y
no removal here: [...],"","",[...]
double removal here: [ "","" "","" ]
[""remove"",""here""],""not"",""here"",[""also"",""here""]
$ perl -pe 'sub x {$a = shift; $a =~ s/"",""/,/g; return $a;}
s/(\[.*?\])/ x($1) /eg ' y
no removal here: [...],"","",[...]
double removal here: [ , , ]
[""remove,here""],""not"",""here"",[""also,here""]
( .*? é uma correspondência não-gulosa, ela pára assim que possível, ou seja, no primeiro ] nesse caso.)