我有一个看似如下的CSV文件:
1,3,"3,5",4,"5,5"
现在我想改变所有“,”而不是引号内的“;”使用sed,所以它看起来像这样:
1;3;"3,5";5;"5,5"
但我找不到有效的模式。
答案 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"