4

我想编辑我的主机文件以匹配我当前的 IP,我可以在 Python 或 AWK 中完成,但我想知道 VIM 中是否有办法......

让我们看看我的意思,我的主机看起来像这样:

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

现在,我想将每个 IP 增加 32,因此最终结果将是:

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

如果我将光标放在正确的 IP 上,然后输入

30 和 CTRL+A

它做我想要的。

唯一的问题,我有大约 300 台主机……而且我需要每 3 个月执行一次……虽然我可以在 Python 中执行,但在 vim 中查看文件感觉更安全,因为我不需要运行脚本,然后控制之后的结果。

以下仅更改第一行:

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

我想在一个循环中重复这个不同的 IP 范围能够说出我应该增加多少次,是否有一个“技巧”可以做到这一点?

在此先感谢您的努力,奥兹

4

3 回答 3

3

可以使用以下替换命令。

:%s/\(\d\+\.\)\{3}\zs\d\+/\=submatch(0)+30/g
于 2012-06-02T02:40:14.750 回答
3

尝试这个:

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

\(\d*\.\d*\.\d*\.\)(retrived by submatch(1)) 匹配 IP 前三个数字和点 (eg 192.168.11.) 和\(\d*\)(retrieveed by submatch(2)) 匹配 IP 最后一个数字。

我认为这是控制它的更好方法:

:let i=30 | %s/^\(\d*\.\d*\.\d*\.\)\(\d*\)/\=submatch(1).(submatch(2)+i)/gc
于 2012-06-01T13:40:32.530 回答
3

我当然不是 vim 专家(还),但我会这样做([]显示光标位置)

192.168.11.[1]72    blazer blazer.mydomain
192.168.11.173    faster faster.mydomain
...
192.168.11.225    schurtig schurtig.mydomain

qa(启动名为 a 的宏)。进行修改(例如30 CTRL-A)。光标现在应该在这里:

192.168.11.20[2]    blazer blazer.mydomain
192.168.11.173    faster faster.mydomain
...
192.168.11.225    schurtig schurtig.mydomain

b转到单词的开头:

192.168.11.[2]02    blazer blazer.mydomain
192.168.11.173    faster faster.mydomain
...
192.168.11.225    schurtig schurtig.mydomain

j(或向下箭头)转到下一个要更改的数字的开头:

192.168.11.202    blazer blazer.mydomain
192.168.11.[1]73    faster faster.mydomain
...
192.168.11.225    schurtig schurtig.mydomain

q终止宏定义。

现在您还剩下 53 个 IP,您只需将宏重复 53 次:53@a

于 2012-06-01T13:24:11.427 回答