转换文本文件内的时间戳

转换文本文件内的时间戳

我将 UDB 中的表提取到本地并转换为 csv 文件格式。提取后,多次显示的时间戳被搞乱了。我想编写 shell 脚本来在看到时间戳格式时更新它。

当前时间戳:

2009-06-08-11.15.45.589225

所需时间戳:

2009-06-08 11:15:45.589225

我尝试使用sedawk命令,但从文件中识别当前时间戳有点困难。

你能帮助我吗?

答案1

这应该有效:

sed -Ei 's/([0-9]{4}-[0-9]{2}-[0-9]{2})-([0-9]{2}).([0-9]{2}).([0-9]{2}).([0-9]{6})/\1 \2:\3:\4.\5/g' filename

括号将时间戳分为 5 组,因此 \1 被 2009 替换,\2 被 06 替换,依此类推。

答案2

GNU 的一种可能性sed

sed -Ei 's/([0-9]{4}-[0-9]{2}-[0-9]{2})-([0-9]{2}).([0-9]{2}).([0-9]{2})/\1 \2:\3:\4/' file

([0-9]{4}-[0-9]{2}-[0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})找到模式YYYY-MM-DD-HH.MM.SS并捕获YYYY-MM-DDHHMMSS

/\1 \2:\3:\4/将整个模式 (YYYY-MM-DD-HH.MM.SS) 替换为捕获的模式 (YYYY-MM-DD) (HH) (MM) (SS),然后将破折号替换为空格,将点替换为:

答案3

tr -c '0-9' '[\n*]' | paste -d '-- ::.'  - - - - - - -

这会将输入中的所有非数字替换为换行符,然后依次paste使用该选项指定的分隔符创建包含七个字段的输出。-d

测试:

$ echo '2009-06-08-11.15.45.589225' | tr -c '0-9' '[\n*]' | paste -d '-- ::.'  - - - - - - -
2009-06-08 11:15:45.589225
$ cat file
2009-06-08-11.15.45.589225
2009-07-09-11.15.45.222222
2009-08-10-11.15.45.333333
$ tr -c '0-9' '[\n*]' <file | paste -d '-- ::.'  - - - - - - -
2009-06-08 11:15:45.589225
2009-07-09 11:15:45.222222
2009-08-10 11:15:45.333333

相关内容