2013-04-26 93 views
2

我经常从我们的支持中获得门票以在isc-dhcp上进行dhcp预留。某些打印机(cof,HP的打印机)通过以下方式在测试页上打印mac地址信息:002481F33A9C;很明显,支持人员以这种方式写入票务。我想更改为00:24:81:F3:3A:9C布局,并使用一种有效的方法进行“插入:2个字符4次后”。在(n)个字符后面插入一个字符并重复(n)次 - vim

我知道,我可以用宏实现这一目标:

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 
[email protected] " 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; 
} 

有没有一种办法通过命令行模式更快地完成这项任务,并且不需要记录宏,因为我们有许多办公室,a nd将这个宏的vimrc传递给所有机器(以及冗余机器)可能会很痛苦?

干杯

回答

3

一种可能的解决方案:

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

说明:

  • 接通 '非常魔法' 模式

  • 匹配,随后12个字符字符串hardware ethernet,然后分号和最终在线

  • 鸿沟的12个字符为6子表达式中,每个由2个字符

  • 替换串中插入各子表达

+0

完美之间的结肠。并且它应该在没有以下情况下替换所有其他mac地址:。诀窍:) – nwildner 2013-04-26 17:45:02

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。你可以试试它是否适用于你的真实文件。

相关问题