Issue
Here is the date format in a bunch of files I have
$cat ./file.log
20220405T130001 message1
20220405T130002 message2
20220405T130003 message3
20220405T130004 message4
20220405T130005 message5
I am able to convert it to a usable date format by doing this:
$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
This seems very inefficient. Is there an easier / better way to accomplish this in bash?
The rules to change would be the following
- insert
-
after first 4 characters - insert
-
after next 2 characters after previous rule - insert
-
after next 2 characters after previous rule - replace
T
with - insert
:
after next 2 characters after previous rule - insert
:
after next 2 characters after previous rule
Solution
Assuming you are always getting same format in input file, a single sed can handle this with multiple capture groups:
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
Answered By - anubhava Answer Checked By - David Goodson (WPSolving Volunteer)