对于这种通用格式的文本文件(1000 +行):
host hostname01.domain.org {
hardware ethernet aa:bb:cc:dd:ee:ff;
fixed-address 10.10.1.1;
}
host hostname02.domain.org {
hardware ethernet a1:b2:c3:d4:e5:f6;
fixed-address 10.10.1.2;
}
host hostname03.domain.org {
hardware ethernet 1a:2b:3c:4d:5e:6f;
fixed-address 10.10.1.3;
}
我希望获得主机名| MAC | ip格式:
hostname01.domain.org|aa:bb:cc:dd:ee:ff|10.10.1.1
hostname02.domain.org|a1:b2:c3:d4:e5:f6|10.10.1.2
hostname03.domain.org|1a:2b:3c:4d:5e:6f|10.10.1.3
我在vim(7.3,Mac OS 10.7.5)中尝试过这些。
:%s/\(.*host \)\(.*\) {/\2|/g
:%s/\(.*\)hardware ethernet \(.*\);/\2|/g
:%s/\(.*\)fixed-address \(.*\)\W/\2/g
:%s/.*}.*//g
在第一行(gg
)的开头,记录一个宏a
qa3Jq
,然后:%norm! @a
将宏应用到整个文件,我得到了这个,和其他不一致的地方:
hostname01.domain.org|aa:bb:cc:dd:ee:ff|10.10.1.1
hostname02.domain.org|a1:b2:c3:d4:e5:f6|10.10.1.2
hostname03.domain.org|
1a:2b:3c:4d:5e:6f|10.10.1.3
我认为宏没有按照我的想法行事,或者我没有正确应用它。我该怎么办呢?
答案 0 :(得分:3)
试试这个cmd:
%s/\v.*host +(\S*)\_.{-}net +([^;]*)\_.{-}ress +([^;]*)\_.{-}\}\n\n?/\1|\2|\3\r/g
宏也是可能的,但如果数据具有不同的fmt,如尾随空格,前导空格或单词/ WORD之间的更多空格,则可能会失败。
答案 1 :(得分:0)
试试这个宏:
"q {^Mv%J0df f vf:F c|^[f;vf;F c|^[f;D0j
适用于您的示例数据(^M
是return,^[
是Escape)。但最有可能的是,你真正需要的是一个完成工作的脚本;我想到了Perl,Python或ViM-Script。