Vim在文件中展开行组

时间:2014-09-25 15:28:04

标签: regex vim text formatting

对于这种通用格式的文本文件(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 

我认为宏没有按照我的想法行事,或者我没有正确应用它。我该怎么办呢?

2 个答案:

答案 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。