我的输入是[10/04/16 01:02:03 BST]
。我怎样才能转换为Apr 10 16 01:02:03
?我不想替换/
为-
。
答案1
使用 awk:
$ echo '[10/04/16 01:02:03 BST]' | awk -F'[][/: ]' 'BEGIN{split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",m,/ /)} {print m[$3+0],$2,$4,$5":"$6":"$7}'
Apr 10 16 01:02:03
怎么运行的
-F'[][/: ]'
这会将字段分隔符设置为
[
、]
、/
、:
或空白。BEGIN{split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",m,/ /)}
m
这定义了一个包含月份名称的数组print m[$3+0],$2,$4,$5":"$6":"$7
这将以新格式打印出日期。
使用反斜杠替代输入
如果输入中有反斜杠,我们可以通过将反斜杠添加到字段分隔符列表中来忽略它们:
$ echo '\[10\/04\/16 01:02:03 BST\]' | awk -F'[][/: \\\\]+' 'BEGIN{split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",m,/ /)} {print m[$3+0],$2,$4,$5":"$6":"$7}'
Apr 10 16 01:02:03
答案2
根据您的版本date
(基于 GNU 的系统),这将起到作用。
date -jf '[%d/%m/%y %T BST]' '[10/04/16 01:02:03 BST]' +'%b %d %g %T'
无效的日期或时间(例如无效的日期或无效的月份)会导致错误。因此此操作无效。
date -jf '[%d/%m/%y %T BST]' '[10/13/16 01:02:03 BST]' +'%b %d %g %T'
由于一个月结束后的天数会延伸到下个月,因此会“结束”到 2016 年 3 月 2 日 01:02:03。
date -jf '[%d/%m/%y %T BST]' '[31/02/16 01:02:03 BST]' +'%b %d %g %T'