Substituir dados entre colchetes e ignorar outras ocorrências

1

Eu tenho um arquivo csv com os dados abaixo

Entrada

"01","5","Male","[""No.**"",""**kg""]","","",""  
"02","6","FeMale","[""No.""]","","",""

Eu gostaria de substituir a string "," que está entre os colchetes, mas não os dados fora dos colchetes.

Saída:

"01","5","Male","[""No.**,**kg""]","","",""  
"02","6","FeMale","[""No.""]","","",""

Eu testei abaixo do comando, mas ele substitui os dados fora dos colchetes, mas não para todas as linhas.

sed '/\[/,/\]/s/"",""/,/'
    
por Harish 24.12.2017 / 19:49

2 respostas

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

    
por 24.12.2017 / 19:57
0
sed '/"Male/s/"",""/,/1' filename

Saída:

"01","5","Male","[""No.**,**kg""]","","",""
"02","6","FeMale","[""No.""]","","",""
    
por 25.12.2017 / 06:25