我一直在尝试清理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 将 : 替换为类似空格的 so:
sed i "s/:/ /g" file.csv
这适用于删除冒号,但不幸的是,这也删除了 url 中的冒号,这不是我想要的。如何指定我只希望命令影响字段 2 中的数据?
使用 awk 你可以做
awk '/:/{sub(/:/, " ")} 1' file.csv
使用 /:/
匹配 的 第一次出现 :
用{sub(/:/, " ")}
替换:用空格
1
只是打印线条。
你可以像这样使用 gnu sed:
sed -r 's/^([^,]*,[^,]*):/1 /g' file.csv
解释
-
^
将表达式锚定在每行的开头 - 现在
[^,]*,
匹配第一个字段,包括分隔符 - 然后从第二个字段到
:
[^,]*:
匹配项 - 括号
^(...):
注意将第二个字段中的:
之前(不包括)的所有内容捕获到1
- 最后用
1
替换(1
后有一个空格将:
替换为正则表达式匹配的在线空间