仅从CSV的字段2中删除“:”并忽略其他字段

时间:2016-05-21 14:54:35

标签: regex linux bash csv sed

我一直在尝试清理包含与此类似的数据的csv文件中的数据:

8979880, Number One : Exclusive Mix, 387387, http://www.smashhits.com
4844404, Top 40 : 1988, 3893938, http://www.best80s.com
48094940, Highlander:The Return, 489494, http://www.instantaccess.com 

我的目标是用空格替换字段2中的冒号。最初我使用sed来替换:with spacelike so:

sed i "s/:/ /g" file.csv

这可以删除冒号,但不幸的是,这也删除了网址中的冒号,这不是我想要的。如何指定我只希望命令影响字段2中的数据?

2 个答案:

答案 0 :(得分:3)

使用awk你可以做到

awk '/:/{sub(/:/, " ")} 1' file.csv

使用/:/匹配第一次出现:

使用{sub(/:/, " ")}替换:使用空格

1只需打印该行。

答案 1 :(得分:2)

您可以像这样使用gnu sed:

sed -r 's/^([^,]*,[^,]*):/\1 /g' file.csv

<强>解释

  • ^将表达式锚定在每行的开头
  • 现在[^,]*,匹配第一个字段,包括分隔符
  • 然后[^,]*:匹配从第二个字段到:
  • ,父母陪审员^(...):注意将第二个字段中的:所有内容都包含在\1
  • 最后替换为\1\1替换:之后有一个空格,其中正则表达式与正则表达式匹配