2

我有一个包含日期和时间的字符串,时间戳= 12-12-2012 16:45:00

我需要将其重新格式化为timestamp= 16:45:00 12-12-2012

如何在 shell 脚本中实现这一点?

请注意:变量的值为12-12-2012 16:45:00时间戳是变量的名称

#!usr/bin/expect
set timestamp "16:45:00 12-12-2012"
Now what should i do so value of timestamp will become 12-12-2012 16:45:00
script extention is .tcl example test.tcl
4

4 回答 4

4

您可以使用可变模式移除。## 的意思是“从左边开始贪婪地删除所有匹配模式的东西”。%% 从右往右表示相同:

tm=${timestamp##* }
dt=${timestamp%% *}
result="$tm $dt"

或者你可以使用 cut 来做同样的事情,给出一个字段分隔符:

tm=$(echo $timestamp | cut -f2 -d' ')
dt=$(echo $timestamp | cut -f1 -d' ')
result="$tm $dt"

或者您可以使用 sed 将它们与正则表达式交换(参见其他帖子)。

或者如果您从 date 命令中提取日期,您可以要求它为您格式化:

result=$(date +'%r %F')

就此而言,您可能有一个日期版本来解析您的日期,然后让您随心所欲地表达它:

result=$(date -d '12/12/2012 4:45 pm' +'%r %F')

诚然,最后一个对日期输入很挑剔......有关接受输入的信息,请参阅“信息日期”。

如果你想使用正则表达式,我喜欢 Perl 的……它们写起来更干净:

echo $timestamp | perl -p -e 's/^(\S+)\s+(\S+)/$2 $1/'

其中 \S 匹配非空格字符,+ 表示“一个或多个”,而 \s 匹配空格。括号会捕获匹配的部分。

编辑:

抱歉,没有意识到“时间戳=”是实际数据的一部分。如果您首先删除该部分,则上述所有示例都有效:

var='timestamp=2012-12-12 16:45:11'
timestamp=${var#timestamp=}
... then as above ...
于 2012-12-21T02:21:50.810 回答
2

使用 sed:

sed 's/\([0-9]*-[0-9]*-[0-9]*\)\([ \t]*\)\(.*\)/\3\2\1/' input

此命令适用于包含该模式的行number-number-number whitespace antyhing。它只是将number-number-number零件\([0-9]*-[0-9]*-[0-9]*\)anything零件交换\(.*\),同时保留原始空格\([ \t]*\)。所以 sed 的替换部分是 \3\2\1,表示第三部分,空格,第一部分。

与 tcl 相同的逻辑:

set timestamp "12-12-2012 16:45:00"
set s [regsub {([0-9]*-[0-9]*-[0-9]*)([ \t]*)(.*)} $timestamp \\3\\2\\1]
puts $s
于 2012-12-21T02:21:40.140 回答
1

解决方案:

string="timestamp= 12-12-2012 16:45:00"
awk '{print $1, $3, $2}' <<< "$string"
于 2012-12-21T02:23:43.963 回答
0

在 bash(和类似的 shell)中:

$ timestamp="12-12-2012 16:45:00"
$ read -a tsarr <<< "$timestamp"
$ echo "${tsarr[1]} ${tsarr[0]}"
16:45:00 12-12-2012
于 2012-12-21T02:38:29.957 回答