使用sed转换日期格式

时间:2012-06-18 12:11:35

标签: date sed format

我有一个问题,如何使用sed将日期从'2012年6月14日下午5:00'转换为'2012-06-14'?所以也省略'下午5点'。 我正在尝试s/(...)(\d\d)(\d\d\d\d)/$2.$1.$3/之类的东西,但无法做到正确。 谢谢!

3 个答案:

答案 0 :(得分:2)

你真的不需要sed去做 - 你需要约会:

$ date --date='Jun 14 2012 5:00PM' '+%Y-%m-%d'
2012-06-14

在此命令中,我要求日期将日期'Jun 14 2012 5:00PM'转换为由四位数年份(%Y)组成的格式,后跟连字符和两位数月份({{ 1}})后跟另一个连字符和两位数的日期(%m)。

现在,关于你的sed命令的一些注释:

Sed使用特定的,有限的正则表达式语法。其中一个区别是括号组前面应有反斜杠,以便有效地进行分组。如果没有反斜杠,则括号将被视为文字括号char。我知道,这与其他语言的正则表达式恰恰相反,但它是如何工作的。所以,而不是

%d
你应该

s/(...)(\d\d)(\d\d\d\d)/$2.$1.$3/

此外,sed中没有s/\(...\)\(\d\d\)\(\d\d\d\d\)/$2.$1.$3/ 通配符。相反,您应该使用\d

[[:digit:]]

或者,更好的是:

s/\(...\)\([[:digit:]][[:digit:]]\)\([[:digit:]][[:digit:]][[:digit:]][[:digit:]]\)/$2.$1.$3/

最后但并非最不重要的是,对匹配组的引用不是由s/\(...\)\([[:digit:]]\{2\}\)\([[:digit:]]\{4\}\)/$2.$1.$3/ 标记,而是用反斜杠标记:

$

(哦,呃,好吧,你也可以使用extended regexes with GNU sed,但有什么好玩的?)

无论如何,这也不符合您的日期 - 我刚刚提到了语法错误,也存在一些语义错误(例如,您的日期由正则表达式中不存在的空格分隔)。尽管如此,这没有问题,因为日期可以做得更好。

答案 1 :(得分:1)

这可能对您有用:

echo "Jun 14 2012 5:00PM" |
sed 's/$/Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12/;s/\(...\) \(..\) \(....\).*\1\(..\).*/\3-\2-\4/'
2012-14-06

使用反向引用添加查找和匹配。

答案 2 :(得分:0)

你可以尝试这样的事情 -

echo "Jun 21 2011 5:00PM" | 
awk '{"date \"+%Y/%m/%d\" -d \""$1" "$2" "$3" \"" | getline var; print var}'

测试:

$ echo "Jun 21 2011 5:00PM" | 
awk '{"gdate \"+%Y/%m/%d\" -d \""$1" "$2" "$3" \"" | getline var; print var}'
2011/06/21
$