Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

incrementing multiple IP addresses in VIM

I would like to edit my hosts file to match my current IPs, I could do it in Python or AWK, but I was wondering if there is a way in VIM...

let's see what I mean, my hosts looks like that:

192.168.11.172    blazer blazer.mydomain
192.168.11.173    faster faster.mydomain
...
192.168.11.225    schurtig schurtig.mydomain

Now, I want to increment every IP by 32 so the end result would be:

192.168.11.202    blazer blazer.mydomain
192.168.11.203    faster faster.mydomain
...
192.168.11.257    schurtig schurtig.mydomain

If I put my cursor on the right IP, and type

30 and CTRL+A

it does what I want.

The only problem, I have about 300 hosts ... and I need to do it once every 3 months ... Although I could do it in Python, seeing the file in vim feels safer, because I don't need to run a script and then control the result after that.

The following changes only the first line:

let i=172 | g/172/s//\=i+30/

I want to repeat this in a loop for different IP ranges being able to say how many times i should be incremented, is there a "trick" that does that?

Thanks in advance for the efforts, Oz

like image 626
oz123 Avatar asked Jan 16 '23 12:01

oz123


1 Answers

Try this:

:let i=30 | %s/^\(\d*\.\d*\.\d*\.\)\(\d*\)/\=submatch(1).(submatch(2)+i)

\(\d*\.\d*\.\d*\.\) (retrieved by submatch(1)) matches the IP first three numbers and dots (eg 192.168.11.) and \(\d*\) (retrieved by submatch(2)) matches the IP last number.

I think this is a better way to control it:

:let i=30 | %s/^\(\d*\.\d*\.\d*\.\)\(\d*\)/\=submatch(1).(submatch(2)+i)/gc
like image 200
dusan Avatar answered Jan 25 '23 15:01

dusan