Astro - Amit
Astro - Amit

Reputation: 767

split a string variable through shell script

i have a string containing date and time as timestamp= 12-12-2012 16:45:00

I need to reformat it into timestamp= 16:45:00 12-12-2012

How to achieve this in shell script?

Note Please : variable's value is 12-12-2012 16:45:00 and timestamp is the name of variable

#!usr/bin/expect
set timestamp "16:45:00 12-12-2012"
Now what should i do so value of timestamp will become 12-12-2012 16:45:00
script extention is .tcl example test.tcl

Upvotes: 2

Views: 3628

Answers (4)

perreal
perreal

Reputation: 98088

Using sed:

sed 's/\([0-9]*-[0-9]*-[0-9]*\)\([ \t]*\)\(.*\)/\3\2\1/' input

this command works on lines containing the pattern number-number-number whitespace antyhing. It simply swaps the number-number-number part \([0-9]*-[0-9]*-[0-9]*\) with the anything part \(.*\), also keeping the original whitespaces \([ \t]*\). So the replace part of sed is \3\2\1, which means the third part, white spaces, and the first part.

Same logic with tcl:

set timestamp "12-12-2012 16:45:00"
set s [regsub {([0-9]*-[0-9]*-[0-9]*)([ \t]*)(.*)} $timestamp \\3\\2\\1]
puts $s

Upvotes: 2

Tony K.
Tony K.

Reputation: 5605

You could use variable patterned removal. ## means "greedily remove everything that matches the pattern, starting from the left". %% means the same from the right:

tm=${timestamp##* }
dt=${timestamp%% *}
result="$tm $dt"

or you could use cut to do the same, giving a field delimiter:

tm=$(echo $timestamp | cut -f2 -d' ')
dt=$(echo $timestamp | cut -f1 -d' ')
result="$tm $dt"

or you could use sed to swap them with a regex (see other post).

or if you are pulling the date from the date command, you could ask it to format it for you:

result=$(date +'%r %F')

and for that matter, you might have a version of date that will parse your date and then let you express it however you want:

result=$(date -d '12/12/2012 4:45 pm' +'%r %F')

admittedely, this last one is picky about date input...see "info date" for information on accepted inputs.

If you want to use regex, I like Perl's...they are cleaner to write:

echo $timestamp | perl -p -e 's/^(\S+)\s+(\S+)/$2 $1/'

where \S matches non-space characters, + means "one or more", and \s matches spaces. The parens do captures of the parts matched.

EDIT:

Sorry, didn't realize that the "timestamp=" was part of the actual data. All of the above example work if you first strip that bit out:

var='timestamp=2012-12-12 16:45:11'
timestamp=${var#timestamp=}
... then as above ...

Upvotes: 4

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 799140

In bash (and similar shells):

$ timestamp="12-12-2012 16:45:00"
$ read -a tsarr <<< "$timestamp"
$ echo "${tsarr[1]} ${tsarr[0]}"
16:45:00 12-12-2012

Upvotes: 0

sampson-chen
sampson-chen

Reputation: 47317

solution here:

string="timestamp= 12-12-2012 16:45:00"
awk '{print $1, $3, $2}' <<< "$string"

Upvotes: 1

Related Questions