我有一个包含日期和时间的字符串时间戳= 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
答案 0 :(得分: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')
admittedely,最后一个对日期输入很挑剔...有关已接受输入的信息,请参阅“信息日期”。
如果你想使用正则表达式,我喜欢Perl的......他们写得更清晰:
echo $timestamp | perl -p -e 's/^(\S+)\s+(\S+)/$2 $1/'
其中\ S匹配非空格字符,+表示“一个或多个”,\ s匹配空格。 parens捕获匹配的部分。
修改强>
抱歉,没有意识到“timestamp =”是实际数据的一部分。如果您首先删除该位,则上述所有示例均有效:
var='timestamp=2012-12-12 16:45:11'
timestamp=${var#timestamp=}
... then as above ...
答案 1 :(得分: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
答案 2 :(得分:1)
awk解决方案:
string="timestamp= 12-12-2012 16:45:00"
awk '{print $1, $3, $2}' <<< "$string"
答案 3 :(得分: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