在 csv 文件中,有几行不适合我需要的数据。例如,这是我的 example.csv 文件:
14/Feb/2016:13:21:33-0500,mk
15/Feb/2016:14:21:33-0500,mk
16/Feb/2016:15:21:33-0500]http://map1.link.de/mk
17/Feb/2016:16:21:33-0500]http://map5.link.de/mk
我可以获取该行并使用以下方法更正它们:
$ cat example.csv | grep "map" | sed 's/\(.*\)].*\/\(.*$\)/\1,\2/'
结果:
16/Feb/2016:15:21:33-0500,mk
17/Feb/2016:16:21:33-0500,mk
但我真正想要的是纠正它们并将它们保存在同一个文件中。我怎样才能做到这一点?
答案1
如果您使用 GNU Sed,只需运行:
sed -i '/map/s/\(.*\)].*\/\(.*$\)/\1,\2/' example.csv
警告:这将覆盖文件的内容。如果您不确定正则表达式是否正确,请先复制一份确切地你想要什么。
如果你不有 GNU Sed,或者您只是想要一个可以在任何 POSIX 系统上运行的更便携的解决方案,使用ex
:
对于不编辑文件的试运行:
printf '%s\n' 'g/map/s/\].*\/\([^/]*\)$/,\1/' %p | ex example.csv
对结果满意后保存更改:
printf '%s\n' 'g/map/s/\].*\/\([^/]*\)$/,\1/' x | ex example.csv