我经常收到来自我们支持的门票,以便在isc-dhcp上进行dhcp预订。某些打印机(cof,cof HP)以这种方式在测试页上打印mac地址信息:002481F33A9C;显然,支持人员以这种方式写入Ticket。我想改为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传递给所有计算机(和冗余计算机)可能是痛苦?
干杯
答案 0 :(得分:2)
可能的解决方案:
:%s/\v(hardware ethernet) (..)(..)(..)(..)(..)(..);$/\1 \2:\3:\4:\5:\6\:\7;/g
说明:
打开非常神奇的&#39;模式
匹配字符串hardware ethernet
后跟12个字符,然后是分号和行尾
将12个字符分成6个子表达式,每个子表达式由2个字符组成
替换在每个子表达式之间插入冒号的字符串
答案 1 :(得分:1)
您可以在整个文件中尝试此命令行:
:%s/\v [0-9A-F]{2}\zs[0-9A-F]{10};$/\=substitute(submatch(0),'[0-9A-F]\{2}',":\\0","g")
由于buildin函数名称,它看起来有点长。这一行将搜索这种模式:
(space)[0-9A-F]{16};<EOL>
并添加:
s。如果它适用于您的真实文件,您可以尝试。