Better way to convert IP?

I am trying to convert 10.AB.C9.XYZ to 10.AB.C2.252.

Right now I am extracting each character and piecing them together.

ip_main=10.AB.C9.XYZ

A_char=${ip_main:3:1}
B_char=${ip_main:4:1}
C_char=${ip_main:6:1}

new_ip="10.${A_char}${B_char}.${C_char}2.252"

Is there a better way to accomplish this?

Asked By: Cruise5

||

If all you want to do is to replace the last digit of the third octet and the whole of the fourth octet with 2.252, then you may do that with

new_ip=${ip_main%?.*}2.252

This deletes the shortest suffix string from $ip_main that matches ?.*, and then appends 2.252 to the result of that. The substitution with this pattern will always affect the last digit of the third octet, the dot between the 3rd and 4th octets, and then the whole 4th octet.

Testing:

$ ip_main=10.AB.C9.XYZ
$ new_ip=${ip_main%?.*}2.252
$ printf '%sn' "$new_ip"
10.AB.C2.252
Answered By: Kusalananda

You can subtract 7 from the third octet, and replace the fourth:

echo 10.11.19.44 | awk -F. '{OFS=FS; print $1,$2,$3-7,252}'
10.11.12.252

This process would work most efficiently if you had a list of IP addresses to change.

Answered By: roaima

With sed :

sed 's/[^.][.][^.]*$/2.252/'
ip="10.AB.C9.XYZ"
echo "$ip" | sed 's/[^.][.][^.]*$/2.252/'
10.AB.C2.252
Answered By: DanieleGrassini
Categories: Answers Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.