替换csv中不在方括号之间的分隔符

时间:2014-08-05 15:54:30

标签: regex unix csv sed

我有很多csv文件,因为分隔符是','而我在阅读时遇到了问题,其中一个字段是一个用逗号分隔值在方括号中的列表。举个例子:

first,last,list
John,Doe,['foo','234','&3bar']
Johnny,Does,['foofo','abc234','d%9lk','other']

我想将分隔符更改为“|” (或其他任何)得到:

first|last|list
John|Doe|['foo','234','&3bar']
Johnny|Does|['foofo','abc234','d%9lk','other']

我该怎么做?我现在正试图使用​​sed,但任何有效的东西都可以。

2 个答案:

答案 0 :(得分:2)

我不知道通过sed或awk是可能的,但你可以通过perl轻松完成。

$ perl -pe 's/\[.*?\](*SKIP)(*F)|,/|/g' file
first|last|list
John|Doe|['foo','234','&3bar']
Johnny|Does|['foofo','abc234','d%9lk','other']

运行以下命令以保存对该文件所做的更改。

perl -i -pe 's/\[.*?\](*SKIP)(*F)|,/|/g' file

答案 1 :(得分:0)

如果它在列表前总是2个值,您可以在perl中使用split limit参数:

perl -pe '$_ = join "|", split /,/, $_, 3' list

这将逗号分割为最多3个字段,然后将它们与管道连接在一起。 -p开关意味着每行输入都存储为$_并在之前处理,然后打印$_

输出:

first|last|list
John|Doe|['foo','234','&3bar']
Johnny|Does|['foofo','abc234','d%9lk','other']