You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

命令解释

咱们拆解一下这个命令的工作原理:

  1. -E参数:启用扩展正则表达式,让分组匹配更直观,不用额外转义括号。
  2. 正则匹配:^([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)
  3. 替换与执行:
    • 用case语句把月份缩写转换成两位数字(May→05)
    • 用echo把所有捕获的数字拼接成无分隔符的目标格式
    • 末尾的e标志告诉sed执行替换后的shell命令,把输出结果替换掉原来的日期字段
  4. 保留其他列:因为正则只匹配到第一个逗号为止,后面的内容完全不受影响。

示例验证

针对你的输入内容:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:23:02