以2017年9月1日格式转换日期'在shell中使用dd.mm.yyyy格式

时间:2017-09-15 10:44:06

标签: shell unix awk sed scripting

我要求以格式转换日期" 2017年9月1日"在shell脚本中到01.09.2017。 并且这应适用于带有后缀" st,nd,rd,th"的任何日期。我尝试使用sed命令,但没有运气。 请任何人帮忙!!!!

非常感谢提前。

2 个答案:

答案 0 :(得分:0)

sed + 日期解决方案:

d="1st September 2017"
date -d"$(sed -E 's/^([0-9]+)(st|nd|rd|th)/\1/' <<<$d)" +"%d/%m/%Y"
01/09/2017

要使其可重复使用,您可以创建如下函数:

convert_date () { date -d"$(sed -E 's/^([0-9]+)(st|nd|rd|th)/\1/' <<<$1)" +"%d/%m/%Y"; }

用法:

convert_date "1st September 2017"
01/09/2017

convert_date "25th October 2017"
25/10/2017

答案 1 :(得分:0)

$ cat file
1st September 2017

$ awk '{printf "%02d.%02d.%04d\n", $1+0, (index("JanFebMarAprMayJunJulAugSepOctNovDec",substr($2,1,3))+2)/3, $3}' file
01.09.2017

鉴于你在帖子的其他地方有关管道分隔输入的评论(下一次在你的问题中包含简明,可测试的样本输入和预期输出,所以我们不会猜测你的要求):

$ cat file
foo|1st September 2017|bar

$ cat tst.awk
BEGIN { FS=OFS="|" }
{
    split($2,d," ")
    mth = (index("JanFebMarAprMayJunJulAugSepOctNovDec",substr(d[2],1,3))+2)/3
    $2 = sprintf("%02d.%02d.%04d", d[1]+0, mth, d[3])
    print
}

$ awk -f tst.awk file
foo|01.09.2017|bar