一次更改文本块中的所有数字

Change all numbers in a block of text all at once

我有一个文件(pac 文件),其中包含某个公司的 IP 地址,我想隐藏其中的每个 IP 地址。我的一个想法是将文件中的每个数字加 1,然后 mod 结果数字为 256,这样它仍然是一个有效的 IP。

例如 129 将变为 2310 % 256 = 6

是否有使用 vim 应用此类更改的快速方法?这听起来雄心勃勃,但我想我还是会问。这是文件中一个块的示例。

if (

    isInNet(ip, "111.222.123.234", "255.255.255.224")  ||

    isInNet(ip, "166.19.10.14", "255.255.255.192") ||


)

{return "DIRECT";}

可以用Vim鲜为人知的"expression register":h CTRL-R_=

在插入模式下,如果您键入 ctrl+r = 它会打开一个提示你可以在那里做数学。

所以对于这一行:

isInNet(ip, "111.222.123.234", "255.255.255.224")  ||

这个模式可以做到(光标在第一个 1

  • ciw 改变里面的小写字
  • ctrl+r = 打开表达式寄存器
  • ctrl+r "粘贴引用寄存器的内容,就是什么你刚刚剪
  • 添加 % 256 并按 Enter

你应该可以将其宏化,并在需要的地方添加 +1 或括号。

这里有一个 search/replace 命令可以完成这一切:

:s/\d\+/\=substitute(tr(submatch(0), '0123456789', '1234567890'), '0', '10', 'g') % 256/g

(添加您自己的范围,例如通过在可视模式下选择一个块并执行 :'<,'>s(或对整个文件执行 :%s))。

  • 我们首先匹配所有数字(即数字序列:\d\+)。
  • 对于我们旋转的每个数字:0 变为 11 变为 2,...,9 变为 0(使用 tr() 完成)。
  • 但是 9 应该变成 10,而不是 0,所以我们应用另一个替换,将所有 0 变成 10(使用substitute()).
  • 然后将最终结果取模 256 (% 256)。

要获得随机 IP,我建议您使用外部程序。例如。 bash 或 python:

:%s/\d\+/\=system('bash -c "echo -ne $(( ( RANDOM % 256 ) ))"')/
:%s/\d\+/\=system('python -c "import random,sys;sys.stdout.write(str(random.randint(0,255)))"')/

这是一个更具体的更长的单行代码,它只匹配 ipv4 地址并生成完整的 IP:

:%s/\v(\d{1,3})(\.\d{1,3}){3}/\=system('python -c "import random,sys;sys.stdout.write(''.''.join(str(random.randint(0,255)) for i in range(4)))"')/