我有一个问题,如何使用sed将日期从'2012年6月14日下午5:00'转换为'2012-06-14'?所以也省略'下午5点'。
我正在尝试s/(...)(\d\d)(\d\d\d\d)/$2.$1.$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
$