rathian0419
rathian0419

Reputation: 5

Bash scripting: using sed and cut to output a specific format

I am working on a bash script using sed and cut that will take times input in various ways and output them in a specific format. Here is an example line:

timeinhour=$(cut -d" " -f2<<<"$line" | sed 's/p/ /'  | sed 's/a/ /' | sed 's/am/ /' | sed 's/pm/ /' | sed 's/AM/ /' | sed 's/PM/ /' )

As you can see I am just removing any trailing am or pm from a time entry that might be formatted in various ways leaving only the numbers.

So I want this line to just spit out the hour of the day (timeinhour), ie "1000AM" = "10" as does "10a" and "10am."

The problem I am running into is the varying lengths of the time entries. If I tell sed or cut to remove the last two characters "1000" will correctly output the hour I need: "10," but using it on one that is already "10" obviously results in a blank output.

I have been experimenting with a line like this

sed 's/\(.*\)../\1/'

If anyone has any advice, I would appreciate it.

For example, this input:

1p
1032AM
419pm
1202a

would produce:

1
10
4
12

Upvotes: 0

Views: 3673

Answers (2)

clt60
clt60

Reputation: 63974

sed 's/[^0-9]//g;s/^[0-9]\{1,2\}$/&00/;s/^\(.*\)..$/\1/'

the steps

1p    -> 1    ->  100 -> 1
10a   -> 10   -> 1000 -> 10
419pm -> 419  ->  419 -> 4
1202a -> 1202 -> 1202 -> 12
  • delete what is not number
  • expand 1 or 2 digit (hours) into 4 digit HHmm
  • ignore last two charactes (minutes)

Upvotes: 2

Lucius
Lucius

Reputation: 102

Try:

timeinhour=$(cut -d" " -f2<<<"$line" | sed 's/p/ /;s/a/ /;s/am/ /;s/pm/ /;s/AM/ /;s/PM/ /' | sed 's/\(.*\)../\1/' # Using your example.

Upvotes: 0

Related Questions