Se o seu sed
suportar a opção -E
( -r
em algumas implementações):
sed -Ee :1 -e 's/^(([^",]|"[^"]*")*),/|/;t1' < file
O
:label
s/pattern/replacement/
t label
É um idioma sed
muito comum. Ele continua fazendo a mesma substituição em um loop, desde que seja bem-sucedido.
Aqui, substituímos a parte principal da linha de 0 ou mais strings ou caracteres citados, que são "
e ,
(capturados em ) seguidos por
,
com de captura e
|
, portanto, em sua amostra, isso significa:
-
John,Tonny,"345.3435,23",56th Street
- > %código% -
John|Tonny,"345.3435,23",56th Street
- > %código% -
John|Tonny,"345.3435,23",56th Street
- > %código% - e paramos aqui porque o padrão não combina mais com isso.
Com John|Tonny|"345.3435,23",56th Street
, você poderia fazer isso com uma substituição com o sinal John|Tonny|"345.3435,23",56th Street
:
perl -pe 's{("[^"]*"|[^",]+)|,}{$1 // "|"}ge'
Aqui, assumindo que aspas são balanceadas na entrada, o padrão corresponderia a todas as entradas, dividindo-as em:
- string entre aspas
- sequências de caracteres diferentes de
John|Tonny|"345.3435,23"|56th Street
ouperl
- uma vírgula
E somente quando a string correspondente for uma vírgula (quando g
não estiver definido na peça de substituição), substitua-a por ,
.