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.)