3

我经常从我们的支持人员那里收到票,以便在 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 002481F33A9C;
    fixed-address 192.x.x.x;
}

会变成这样:

host foo {
    hardware ethernet 00:24:81:F3:3A:9C;
    fixed-address 192.x.x.x;
}

有没有办法通过命令行模式更快地做到这一点并且不记录宏,因为我们有很多办公室,并且将带有这个宏的 vimrc 传递给所有机器(和冗余机器)可能会很痛苦?

干杯

4

2 回答 2

2

一个可能的解决方案:

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

解释:

  • 打开“非常神奇”模式

  • 匹配字符串hardware ethernet后跟 12 个字符,然后是分号和行尾

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

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

于 2013-04-26T17:06:57.127 回答
1

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

:%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>

并添加:s。你可以试试它是否适用于你的真实文件。

于 2013-04-26T17:00:17.570 回答