como substituir um caractere dentro de várias palavras duplas entre aspas dentro de uma linha usando sed?

0

Eu tenho um arquivo de texto incluindo o formato de texto como este.

012345,"[ThinkPadT2/3Gband,Mac]",Lenovo,"iPhone3G,A1241"

Como faço para substituir vírgula dentro de palavras somente dentro de aspas duplas pelo operador pipe (|) usando sed. Eu preciso de saída assim:

012345,"[ThinkPadT2/3Gband | Mac]",Lenovo,"iPhone3G|A1241"
    
por linux beginnner 22.01.2015 / 20:48

3 respostas

2

Este é um procedimento padrão para fazer com que sed não-gananciosa e referência anterior dica para substring (s) entre parênteses ()

sed 's/\(\"[^",]\{1,\}\),\([^",]\{1,\}\"\)/ | /g'

Ou para o% GNUsed

sed -r 's/("[^",]+),([^",]+")/ | /g'
    
por 22.01.2015 / 21:25
0

Você pode tentar algo assim:

$ cat filename
012345,"[ThinkPadT2/3Gband,Mac]",Lenovo,"iPhone3G,A1241"

$ cat filename | sed -E 's:([A-Z,a-z]),([A-Z,a-z]):|:g'
012345,"[ThinkPadT2/3Gband|Mac]",Lenovo,"iPhone3G|A1241"
    
por 22.01.2015 / 21:47
-1

Sed não é a ferramenta certa para isso. Eu acho que pode exigir alguns recursos avançados para alcançar como acima. Aqui está o perl on-liner que substitui qualquer número de vírgulas duplas presentes entre aspas duplas com <space>|<space> .

$ echo '012345,"[ThinkPadT2/3Gband,Mac,Apple]",Lenovo,"iPhone3G,A1241"' | perl -pe 's/,(?!(?:"[^"]*"|[^"])*$)/ | /g'
012345,"[ThinkPadT2/3Gband | Mac | Apple]",Lenovo,"iPhone3G | A1241"
    
por 24.01.2015 / 13:15