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

时间:2015-09-29 22:07:28

标签: vim substitution

我有一个文件(pac文件),其中包含某个公司的IP地址,并希望隐藏其中的每个IP地址。我的一个想法是在文件中的每个数字上加1,然后用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";}

3 个答案:

答案 0 :(得分:4)

这是一个完成所有操作的单个搜索/替换命令:

: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(使用{{完成1}})。
  • 然后以256(substitute())模数取得最终结果。

答案 1 :(得分:3)

您可以使用Vim鲜为人知的“表达式寄存器”:h CTRL-R_=

在插入模式下,如果您键入 ctrl + r = ,则会打开一个提示,您可以在此处进行数学运算。

所以对于这一行:

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

这种模式可以做到(光标位于第一个1

  • c i w 更改小写字词
  • ctrl + r = 打开表达式寄存器
  • ctrl + r 粘贴引用寄存器的内容,这就是你刚剪的内容
  • 添加% 256并按 Enter

您应该能够对此进行宏观化,并在您需要的地方添加+1或括号。

答案 2 :(得分:1)

要获取随机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)))"')/

这是一个更具体的更长的oneliner,只匹配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)))"')/