在(n)个字符后插入一个字符并重复(n)次-vim

在(n)个字符后插入一个字符并重复(n)次-vim,vim,configuration-files,Vim,Configuration Files,我经常从我们的支持部门收到在isc dhcp上进行dhcp预订的票证。一些打印机(cof、cof HP)以以下方式打印测试页上的mac地址信息:002481F33A9C;显然,支持人员是这样写的。我想更改为00:24:81:F3:3A:9C布局,并使用一种有效的方式执行“插入:在2个字符之后插入4次” 我知道我可以通过宏实现这一点: qq " start recording -> register q ll " move the cursor 2 characters ri

我经常从我们的支持部门收到在isc dhcp上进行dhcp预订的票证。一些打印机(cof、cof HP)以以下方式打印测试页上的mac地址信息:002481F33A9C;显然,支持人员是这样写的。我想更改为00:24:81:F3:3A:9C布局,并使用一种有效的方式执行“插入:在2个字符之后插入4次”

我知道我可以通过宏实现这一点:

qq     " start recording -> register q
ll     " move the cursor 2 characters right
i      " enter insert mode
:      " insert :
<Esc>  " switch to normal mode and cursor goes 1 character back
l      " move the cursor 1 character right(since insert mode back one character)
q      " stop recording
4@q    " execute macro 4 times
将变成这样:

host foo {
    hardware ethernet 00:24:81:F3:3A:9C;
    fixed-address 192.x.x.x;
}
有没有一种方法可以通过命令行模式更快地实现这一点,而无需记录宏,因为我们有很多办公室,将带有此宏的vimrc传递给所有机器(以及冗余机器)可能会很痛苦


干杯

您可以在整个文件中尝试以下命令行:

:%s/\v [0-9A-F]{2}\zs[0-9A-F]{10};$/\=substitute(submatch(0),'[0-9A-F]\{2}',":\\0","g")
由于内置函数名的缘故,它看起来有点长。此行将搜索此模式:

(space)[0-9A-F]{16};<EOL>
(空格)[0-9A-F]{16};
并添加
s。如果它适用于真实文件,您可以尝试使用。

一个可能的解决方案:

:%s/\v(hardware ethernet) (..)(..)(..)(..)(..)(..);$/\1 \2:\3:\4:\5:\6\:\7;/g
说明:

  • 打开“非常神奇”模式

  • 匹配字符串
    硬件以太网
    ,后跟12个字符,然后是分号和行尾

  • 将12个字符分成6个子表达式,每个子表达式由2个字符组成

  • 替换在每个子表达式之间插入冒号的字符串


完美。并且它应该替换所有其他出现的mac地址,不带:。成功了:)
:%s/\v(hardware ethernet) (..)(..)(..)(..)(..)(..);$/\1 \2:\3:\4:\5:\6\:\7;/g