Заменить разделитель CSV с помощью sed - PullRequest
2 голосов
/ 22 января 2012

У меня есть CSV-файл, который выглядит следующим образом:

1,3,"3,5",4,"5,5"

Теперь я хочу изменить все "," не в кавычках на ";"с sed, так это выглядит так:

1;3;"3,5";5;"5,5"

Но я не могу найти шаблон, который работает.

Ответы [ 4 ]

2 голосов
/ 23 января 2012

Если вы ожидаете только цифры, то будет работать следующее выражение

sed -e 's/,/;/g' -e 's/\("[0-9][0-9]*\);\([0-9][0-9]*"\)/\1,\2/g'

например,

$ echo '1,3,"3,5",4,"5,5"' | sed -e 's/,/;/g' -e 's/\("[0-9][0-9]*\);\([0-9][0-9]*"\)/\1,\2/g'
1;3;"3,5";4;"5,5"

Вы не можете просто заменить [0-9] [0-9] * с. * для сохранения любого, в том числе в кавычках,. * слишком жадный и слишком много соответствует.Таким образом, вы должны использовать [a-z0-9] *

$ echo '1,3,"3,5",4,"5,5",",6","4,",7,"a,b",c' | sed -e 's/,/;/g' -e 's/\("[a-z0-9]*\);\([a-z0-9]*"\)/\1,\2/g'
1;3;"3,5";4;"5,5";",6";"4,";7;"a,b";c

. Он также имеет преимущество перед первым решением в простоте понимания.Мы просто заменяем каждый на;а потом исправлять каждое;в кавычках назад к,

1 голос
/ 22 января 2012

Вы можете попробовать что-то вроде этого:

echo '1,3,"3,5",4,"5,5"' | sed -r 's|("[^"]*),([^"]*")|\1\x1\2|g;s|,|;|g;s|\x1|,|g'

, который заменяет все запятые в кавычках на \ x1 char, затем заменяет все запятые, оставленные точками с запятой, а затем заменяет \ x1 символы обратно на запятые. Это может сработать, если файл сформирован правильно, в нем изначально нет символов \ x1 и нет ситуаций, когда в двойных кавычках есть двойные кавычки, такие как "a \" b ".

0 голосов
/ 23 января 2012

Это может работать для вас:

echo '1,3,"3,5",4,"5,5"' | 
sed 's/\("[^",]*\),\([^"]*"\)/\1\n\2/g;y/,/;/;s/\n/,/g'
1;3;"3,5";4;"5,5"

Вот альтернативное решение, которое более длинное, но более гибкое:

echo '1,3,"3,5",4,"5,5"' | 
sed 's/^/\n/;:a;s/\n\([^,"]\|"[^"]*"\)/\1\n/;ta;s/\n,/;\n/;ta;s/\n//'
1;3;"3,5";4;"5,5"
0 голосов
/ 22 января 2012

Использование gawk

gawk '{$1=$1}1' FPAT="([^,]+)|(\"[^\"]+\")" OFS=';' filename

Тест:

[jaypal:~/Temp] cat filename
1,3,"3,5",4,"5,5"
[jaypal:~/Temp] gawk '{$1=$1}1' FPAT='([^,]+)|(\"[^\"]+\")' OFS=';' filename
1;3;"3,5";4;"5,5"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...