【问题标题】:incrementing multiple IP addresses in VIM在 VIM 中增加多个 IP 地址
【发布时间】:2012-06-06 17:44:26
【问题描述】:

我想编辑我的主机文件以匹配我当前的 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 范围内循环重复此操作,以便能够说出我应该增加多少次,是否有这样做的“技巧”?

提前感谢您的努力, 盎司

【问题讨论】:

    标签: vim replace increment


    【解决方案1】:

    试试这个:

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

    \(\d*\.\d*\.\d*\.\)(由submatch(1)检索)匹配IP前三个数字和点(例如192.168.11.)和\(\d*\)(由submatch(2)检索)匹配IP最后一个数字。

    我认为这是一种更好的控制方式:

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

    【讨论】:

    • \1\2 将与 submatch(1)submatch(2) 相同,不是吗?
    • @Shahbaz 是的,但是使用 \=submatch 我可以使用 i 进行总和
    • @dusan,submatch(1) 和 submatch(2) 代表什么?
    • @Oz123,当您使用\(...\) 时,其中的匹配字符串可以稍后被submatch 引用。在 dusan 的示例中,有 2 个,一个匹配 IP 的前 3 个数字(和 3 个点),第二个匹配第四个数字。
    • @Shahbaz,谢谢,我明白了。一开始杜桑的回答看起来像中国人。但现在我看到他做了什么,他匹配了前 3 个字节,然后是最后一个字节,最后告诉 vim 将最后一个字节增加 30。 VIM 是该死的表现力!
    【解决方案2】:

    我当然不是 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

    【讨论】:

    • 感谢 shabaz,这也是一种方式......但我更多地考虑使用 let i=172 编写 vim 脚本,然后进行 53 次更改......但我也喜欢这个解决方案。让我们看看接下来会发生什么:-)
    • @Oz123,我还没学过 ViM 脚本。学得太多,时间太少……
    • @Shabaz,这完全没问题。您的回答仍然值得赞赏。信不信由你,我仍然从中学到了如何做宏,所以你会得到一个赞成票。
    • @Oz123,宏非常有用。不过,它们可能会变得非常棘手。例如,您应该避免使用自动完成功能或其他可能使事情以您不期望的方式出现的东西。作为奖励,您应该知道即使:w 和其他命令也可以保存在宏中。例如,如果你打开了很多文件(比如vim *.c),你可以保存像qa ... :w :bn q 这样的宏,然后更新、保存并切换到下一个文件!
    【解决方案3】:

    可以使用以下替换命令。

    :%s/\(\d\+\.\)\{3}\zs\d\+/\=submatch(0)+30/g
    

    【讨论】:

    • 啊。我得到了完全相同的简化。好吧,我会使用verymagic:let i=30 | %s/\v(\d+\.){3}\zs\d+/\=submatch(0)+i/g
    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多