一次更改文本块中的所有数字
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
变为 1
,1
变为 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)))"')/
我有一个文件(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
变为1
,1
变为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)))"')/