Home > OS >  How to transform a string to a specific format in bash?
How to transform a string to a specific format in bash?

Time:11-16

I have a bash script that reads in data from an RTC via i2cdump

#!/usr/bin/env bash

TIME=$(i2cdump -r 0-6 -y 0 0x68 b)
TIME=${TIME:76:20}
echo $TIME

OUTPUT: 16 44 17 03 15 11 22

The output is in the form SEC MIN HOUR DAY DATE MONTH YEAR

I would like to now set my system time based on this output using timedatectl which requires the output be transformed

# timedatectl set-time 'YEAR-MONTH-DATE HOUR:MIN:SEC'

How can I transform a string of form SEC MIN HOUR DAY DATE MONTH YEAR to 'YEAR-MONTH-DATE HOUR:MIN:SEC'?

I've tried replacing the spaces with colons for the time, but don't know how to properly format the date to be preceding the time.

CodePudding user response:

Probably just passing the old format to read and then assemble from the variables is the cleanest way:

TIME="16 44 17 03 15 11 22"
read SEC MIN HOUR DAY DATE MONTH YEAR <<< "$TIME"
NEWTIME="20$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC"
echo "$NEWTIME"

or more old fashion with piping into a while loop:

echo $TIME | while read SEC MIN HOUR DAY DATE MONTH YEAR; do
        NEWTIME="20$YEAR-$MONTH-$DATE $HOUR:$MIN:$SEC"
        echo "$NEWTIME"
done

Output:

2022-11-15 17:44:16

Of course sed and awkalso works, though slightly less readable:

echo "16 44 17 03 15 11 22" | sed -e's/\([0-9][0-9]\) \([0-9][0-9]\) \([0-9][0-9]\) \([0-9][0-9]\) \([0-9][0-9]\) \([0-9][0-9]\) \([0-9][0-9]\)/20\7-\6-\5 \3:\2:\1/'
2022-11-15 17:44:16
echo "16 44 17 03 15 11 22" | awk '{print 20$7"-"$6"-"$5" "$3":"$2":"$1}'
2022-11-15 17:44:16

  • Related