如何用sed仅转换CSV首列为YYYYMMDDHHmmss格式且不修改其他列?
使用sed转换CSV第一列的日期格式
要实现仅将CSV第一列的YYYY-Mon-DD HH:MM:SS格式转换为YYYYMMDDHHmmss,同时保留其他列不变,可以用以下sed命令:
解决方案命令
sed -E 's/^([0-9]{4})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2}),/echo "\1$(case \2 in Jan)01;;Feb)02;;Mar)03;;Apr)04;;May)05;;Jun)06;;Jul)07;;Aug)08;;Sep)09;;Oct)10;;Nov)11;;Dec)12;;esac)\3\4\5\6",/e' input.csv
命令解释
咱们拆解一下这个命令的工作原理:
-E参数:启用扩展正则表达式,让分组匹配更直观,不用额外转义括号。- 正则匹配:
^([0-9]{4})-(Jan|Feb|...|Dec)-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2}),精准匹配每行开头的日期字段,捕获以下内容:\1:4位年份(比如2018)\2:3字母月份缩写(比如May)\3:2位日期(比如17)\4:2位小时(比如21)\5:2位分钟(比如33)\6:2位秒数(比如16)
- 替换与执行:
- 用
case语句把月份缩写转换成两位数字(May→05) - 用
echo把所有捕获的数字拼接成无分隔符的目标格式 - 末尾的
e标志告诉sed执行替换后的shell命令,把输出结果替换掉原来的日期字段
- 用
- 保留其他列:因为正则只匹配到第一个逗号为止,后面的内容完全不受影响。
示例验证
针对你的输入内容:
2018-May-17 21:33:16,VF-AUDI-prod,Start:2018-May-17:End:2018-May-19 2018-May-17 21:34:15,VF-AUDI-prod,Start:2018-May-17:End:2018-May-19 2018-May-17 21:35:17,VF-AUDI-prod,Start:2018-May-17:End:2018-May-19
执行命令后会输出:
20180517213316,VF-AUDI-prod,Start:2018-May-17:End:2018-May-19 20180517213415,VF-AUDI-prod,Start:2018-May-17:End:2018-May-19 20180517213517,VF-AUDI-prod,Start:2018-May-17:End:2018-May-19
完全符合你的需求!
额外提示
- 如果你的sed版本不支持
-E,可以换成-r参数(GNU sed兼容) - 如果输入中有小写的月份缩写(比如
may),可以修改正则为(Jan|jan|Feb|feb|...),或者在case语句里添加小写分支(比如jan)01;;)
内容的提问来源于stack exchange,提问作者Andrés Mauricio
相关产品推荐
相关产品推荐

