我有一个记录的文件,其中包含包含GMT偏移的时间戳字段。我想使用sed
命令将记录上的值替换为常规时间戳(不带GMT偏移量)。
例如:
`$date -d '2012/11/01 00:50:22 -0800' '+%Y-%m-%d %H:%M:%S'`
返回此值,这是我要做的事情:
2012-11-01 01:50:22
除非我想在此文件的每一行上执行该操作,并将date命令应用于timestamp值。这是一个示例记录:
"SB","6GV96644X48128125","","","","T0006",2012/10/03 13:08:43 -0700,"NJ"
这是我的代码:
head -1 myfile | sed 's/,[0-9: /\-]\{25\},/,'"`date -d \1 '+%Y-%m-%d %H:%M:%S'`"',/
哪个不起作用:它只是忽略\ 1并将匹配的模式替换为今天的日期:
"SB","6GV96644X48128125","","","","T0006",2012-11-14 01:00:00,"NJ"
我希望\1
会将匹配的模式传递给date函数并返回一个常规时间戳值(如上面提供的示例所示,显示日期函数如何应用GMT偏移量并返回常规值stimestamp string)并将替换记录中的旧值。
答案 0 :(得分:2)
我会改用awk
。例如:
awk '{cmd="date -d \""$7"\" \"+%Y-%m-%d %H:%M:%S\"";
cmd | getline k; $7=k; print}' FS=, OFS=, myFile
这将使用在第7个字段的原始内容上运行date命令的结果替换第7个字段。
答案 1 :(得分:0)
在sed
:
head -1 datefile |
sed '
# handle % in input correctly
s/%/%%/g
# execute date(1) command
s/\(.*,\)\([0-9: /\-]\{25\}\)\(,.*\)/'"date -d '\2' '+\1%Y-%m-%d %H:%M:%S\3'"'/e'
'
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed -r 's/^(([^,]*,){6})([^,]*)(.*)/printf "%s%s%s" '\''\1'\'' $(date -d '\''\3'\'' '\''+%Y-%m-%d %H:%M:%S'\'') '\''\4'\''/e;q' file
答案 3 :(得分:0)
使用
head -1 datefile | sed -e 's?\(..\)/\(..\)/\(.... ..:..:..\)?'"date -d '\2/\1/\3' '+%s'"'?e'