【问题标题】:sed command to change date formatsed 命令更改日期格式
【发布时间】:2016-01-26 02:02:30
【问题描述】:

这是我正在使用的文件的 sn-p:

709ENVUN07,SET1,FE10,GB0009252882,GB,GBX,NULL,S,O,LO,1510.00000000,173,N,F,28022007,07:51:15,3717
208ATNHG07,SET1,FE10,GB0009252882,GB,GBX,NULL,S,O,LO,1550.00000000,1800,N,F,18012007,15:48:21,654681

如您所见,日期格式为:2802200718012007

使用 sed 我已成功更改为我想要的格式。

    gzip -dc allGlaxoOrderHistory.CSV.gz |sed 's/\([0-9]\{2\}\)\([0-9]\{2\}\)\(2[0-9]\{3\}\)/\1-\2-\3/g' > newOrderHistory.csv

但是 sed 也将 GB0009252882 更改为 GB00-09-252882,如下所示

709ENVUN07,SET1,FE10,GB00-09-252882,GB,GBX,NULL,S,O,LO,1510.00000000,173,N,F,28-02-2007,07:51:15,3717
208ATNHG07,SET1,FE10,GB00-09-252882,GB,GBX,NULL,S,O,LO,1550.00000000,1800,N,F,18-01-2007,15:48:21,654681

问题是如何在不改变GB0009252882 的情况下将2802200718012007 更改为28-02-200718-01-2007

【问题讨论】:

    标签: date unix sed format command


    【解决方案1】:

    [编辑]

    您的日期字段是从开始算起的第 15 个。你可以这样写你的模式:

    sed 's/\(\([^,]*,\)\{14\}..\)\(..\)/\1-\3-/'
    

    ,[^,]*, 描述一个字段(带分隔符)。

    您还可以使用 awk 更轻松地按字段工作。只需将输入输出分隔符设置为,

    使用 awk (Gnu),定位第 15 个字段:

    awk -F, -vOFS=, '{$15=gensub(/(..)(..)(....)/, "\\1-\\2-\\3", "g", $15)}1' yourfile
    

    参数-F,设置输入分隔符,-vOFS=,设置输出分隔符。末尾的1 用作print 的快捷方式。

    【讨论】:

    • 有了行尾锚,你绝对不需要/g全局修饰符。
    • 日期不是我的最后一个字段,如下所示:709ENVUN07,SET1,FE10,GB0009252882,GB,GBX,NULL,S,O,LO,1510.00000000,173,N,F,28022007 ,07:51:15,3717
    • 在此之前从未使用过 awk,请告知我如何在此示例中使用它
    • @Hassan ... 如果没有其他 8 位字段,您可以(象征性地)s/,DDMMYYYY,/,DD-MM-YYYY,/ ... 也就是说,在匹配项中包含逗号,并确保将它们回到替换。您还应该使用此完整记录编辑您的问题 - 只有部分 3 字段示例您的问题具有误导性。
    • @StephenP 谢谢,我已更改问题以按要求演示完整字段,但是 s/,DDMMYYYY,/,DD-MM-YYYY,/ 没有做任何事情
    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 2016-03-08
    • 2021-07-09
    • 1970-01-01
    • 2016-08-12
    • 2011-06-05
    • 2016-11-22
    相关资源
    最近更新 更多