![转换文本文件内的时间戳](https://linux22.com/image/163266/%E8%BD%AC%E6%8D%A2%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E5%86%85%E7%9A%84%E6%97%B6%E9%97%B4%E6%88%B3.png)
我将 UDB 中的表提取到本地并转换为 csv 文件格式。提取后,多次显示的时间戳被搞乱了。我想编写 shell 脚本来在看到时间戳格式时更新它。
当前时间戳:
2009-06-08-11.15.45.589225
所需时间戳:
2009-06-08 11:15:45.589225
我尝试使用sed
和awk
命令,但从文件中识别当前时间戳有点困难。
你能帮助我吗?
答案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-DD
和HH
。MM
。SS
/\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