Newbie
Newbie

Reputation: 3

Is there a way to format the width of a substring within a string in a bash/sh script?

I have to format the width of a substring within a string using a bash script, but without using tokens or loops. A single character between two colons should be prepended by a 0 in order to match the standard width of 2 for each field.

For e.g

from:

6:0:36:35:30:30:72:6c:73:0:c:52:4c:30:31:30:31:30:30:30:31:36:39:0:1:3

to

06:00:36:35:30:30:72:6c:73:00:0c:52:4c:30:31:30:31:30:30:30:31:36:39:00:01:03

How can I do this?

Upvotes: 0

Views: 175

Answers (4)

Walter A
Walter A

Reputation: 19982

With

str="06:00:36:35:30:30:72:6c:73:00:0c:52:4c:30:31:30:31:30:30:30:31:36:39:00:01:03"

you can add a '0' to all tokens and remove those that are unwanted:

sed -r 's/0([0-9a-f]{2})/\1/g' <<< "0${str//:/:0}"

That doesn't feel right, making errors and repairing them.

A better alternative is

echo $(IFS=:; printf "%2s:" ${str} | tr " " "0")

Upvotes: 0

Bosz
Bosz

Reputation: 379

Bash solution:

IFS=:; for i in $string; do echo -n 0$i: | tail -c 3; done

Upvotes: 0

P....
P....

Reputation: 18351

awk -F: -v OFS=: '{for(i=1;i<=NF;i++) if(length($i)==1)gsub($i,"0&",$i)}1' file

Output:

06:00:36:35:30:30:72:6c:73:00:0c:52:4c:30:31:30:31:30:30:30:31:36:39:00:01:03

This will divide the whole line into fields separated by : , if the length of any of the field is == 1. then it will replace that field with 0field.

Upvotes: 0

John Kugelman
John Kugelman

Reputation: 361585

sed -r 's/\<([0-9a-f])\>/0\1/g'

Search and replace with a regex. Use \< and \> to match word boundaries so [0-9a-f] only matches single digits.

$ sed -r 's/\<([0-9a-f])\>/0\1/g' <<< "6:0:36:35:30:30:72:6c:73:0:c:52:4c:30:31:30:31:30:30:30:31:36:39:0:1:3"
06:00:36:35:30:30:72:6c:73:00:0c:52:4c:30:31:30:31:30:30:30:31:36:39:00:01:03

Upvotes: 2

Related Questions