bash更有效地转换奇数日期格式以被linux日期识别

Dav*_*ave 2 linux bash awk date sed

这是我拥有的一堆文件中的日期格式

$cat ./file.log
20220405T130001 message1
20220405T130002 message2
20220405T130003 message3
20220405T130004 message4
20220405T130005 message5
Run Code Online (Sandbox Code Playgroud)

我可以通过这样做将其转换为可用的日期格式:

$cat ./file.log | sed 's/^\(.\{4\}\)/\1-/' | sed 's/^\(.\{7\}\)/\1-/' | sed 's/\(.\{10\}\)./\1 /' |  sed 's/^\(.\{13\}\)/\1:/' | sed 's/^\(.\{16\}\)/\1:/
2022-04-05 13:00:01 message1
2022-04-05 13:00:02 message2
2022-04-05 13:00:03 message3
2022-04-05 13:00:04 message4
2022-04-05 13:00:05 message5
Run Code Online (Sandbox Code Playgroud)

这看起来效率很低。在 bash 中是否有更简单/更好的方法来完成此任务?

更改的规则如下

  • -在前 4 个字符后插入
  • -在上一条规则后的下 2 个字符后插入
  • -在上一条规则后的下 2 个字符后插入
  • 替换T 上一条规则后的下 2 个字符
  • :在上一条规则后的下 2 个字符后插入
  • :在上一条规则后的下 2 个字符后插入

anu*_*ava 5

假设您始终在输入文件中获得相同的格式,则单个 sed 可以使用多个捕获组来处理此问题:

sed -E 's/^(.{4})(..)(..)T(..)(..)/\1-\2-\3 \4:\5:/' file

2022-04-05 13:00:01 message1
2022-04-05 13:00:02 message2
2022-04-05 13:00:03 message3
2022-04-05 13:00:04 message4
2022-04-05 13:00:05 message5
Run Code Online (Sandbox Code Playgroud)