使用sed更改CSV分隔符

时间:2012-01-22 18:20:12

标签: regex sed

我有一个看似如下的CSV文件:

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

现在我想改变所有“,”而不是引号内的“;”使用sed,所以它看起来像这样:

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

但我找不到有效的模式。

4 个答案:

答案 0 :(得分:2)

如果您只期望数字,则以下表达式将起作用

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

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

与第一个易于理解的解决方案相比,它还具有优势。我们只是替换每一个;然后纠正每一个;在引号中回到a,

答案 1 :(得分:1)

您可以尝试这样的事情:

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

用\ x1 char替换引号中的所有逗号,然后用分号替换所有留下的逗号,然后将\ x1 chars替换回逗号。这可能有用,因为文件正确形成,其中最初没有\ x1字符,并且没有双引号内有双引号的情况,例如“a \”b“。

答案 2 :(得分:0)

使用 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"

答案 3 :(得分:0)

这可能对您有用:

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"