vim - 一次更改文本 block 中的所有数字

标签 vim substitution

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

例如 129 将变为 2310 % 256 = 6

有没有一种快速的方法可以使用 vim 来应用这样的更改?这听起来雄心勃勃,但我想我还是会问。这是文件中一个 block 的示例。

if (

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

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


)

{return "DIRECT";}

最佳答案

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

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

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

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

关于vim - 一次更改文本 block 中的所有数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32854568/

相关文章:

vim - 在 Mercurial 中使用 VCSCommand Vim 插件时出现问题

regex - 在 Vim 的新选项卡中显示所有匹配的 grep 结果

vim - vim-go可以补全第三方框架吗

regex - Perl 正则表达式从替换中返回匹配项

vim - Vim 加载 vimrc 后是否加载插件?

regex - 是否可以更改 vim regexp 方言?

c++ - 有模板成员(member)-模板模板推演

python - Python 3.3 中的 re.sub

java - Java 中的 ROT-N(或 ROT-X)函数

regex - Sed 用另一个字符的多次重复替换一个字符的多次重复