APP下载

Vim在网络维护工作中的应用

2017-10-17董洪蒙

科学与财富 2017年27期
关键词:杂乱编辑器字符串

董洪蒙

Vim是Linux上著名的文本编辑器,他是早年的Vi编辑器的加强版。gVim是Vim的图形前端,它是跨平台的编辑器,基本上主流的操作系统上面都有它的版本。这个极具Unix特色和风格的编辑器功能十分强大,在实际工作中,尤其是批量文本处理上有着令人倍感方便快捷的特性。

Vim的具体编辑操作功能这里不做详述,笔者主要针对其强大的正则替换功能加以解析,如果运用得当,将会在大批量文本处理时事半功倍,极大提高处理效率,这样对程序员或网络管理员而言,将会得到一件得心应手的利器,在实际工作中有着非常重要的意义。下文讲述以gVim for windows作为使用环境。

在非编辑状态下,按下英文半角字符冒号即可进入Vim命令模式,正则替换要在此模式下输入特定指令加以执行,如下:

:g/test string/s//replace test string/g

可见替换命令由/分隔的6小段组成,说明如下:

第1段,例中“g”,代表替换范围为全部行,也可用“101,200”这样的格式代表特定的行号范围。

第2段,例中“test string”,搜索的字符串,可使用正则表达式,详细的正则表达式这里不做详述,只做一些常用功能的说明:^代表行首,$代表行尾,.代表任意字符,\s代表空白(空白包括空格、TAB)字符,\w代表字母字符,\d代表若干数字字符,.、\s、\w、\d的后面跟\+代表1或多个字符,跟*代表0或多字符(贪婪模式),跟\{-}代表非贪婪模式的*。另外在正则中还可以用\(\)进行分组。

第3段,例中“s”,代表要替换,需后续段指明如何替换,如果不包含第3段及以后的段,就代表搜索指令,如果第3段为d,则为删除,无需后续段。

第4段,例中为空,如果找到搜索串行后,要替换的不是搜索串,而是其它字符串,可在这里指定,一般除特殊情况不做指定。

第5段,例中“replace string”要替换的字符串,为空代表删除,可以使用第2段中的分组编号\1,\2等,代表从搜索串中取特定组的字符串,组合到替换字符串中,最后用作替换的串。

第6段,例中“g”,代表找到搜索字符串所在行后,全行搜索进行替换,如不加,则代表仅对本行进行一次搜索替换。

下面试举几例,对其进行说明。

例1,如下交换机配置vlan脚本:

vlan 1

vlan 2

vlan 3

实际工作中,vlan可能很多,有上千个,现在要在每个vlan前加个no,如果每行手工粘贴是不现实的,在Vim中可用一个简单的正则替换瞬间完成:

:g/^vlan/s//no vlan/

第2段的^vlan,代表寻找每行起头为vlan的所在行,第6段没有加g,因为我们只需替换每行起头的vlan为no vlan。

例2,有很长一段从设备上寻出的脚本,空格非常杂乱:

nfpp

log-buffer entries 1024

log-buffer logs 1 interval 300

ip-guard rate-limit per-src-ip 32

ip-guard attack-threshold per-src-ip 64

no arp-guard enable

arp-guard rate-limit per-src-ip 16

arp-guard rate-limit per-src-mac 16

同样行数非常多,每行头尾有很多多余的空白需删除,手工不适合,用word替换也不行,因为行中间还有有意义的空格,用Vim如下处理:

:g/^\s*/s/// # 删除行首杂乱空白

:g/\s*$/s/// # 删除行尾杂乱空白

注意第5段替换字符串为空,即为删除搜索到的字符串。

例3,有如下脚本:

ap-config 教A-103

ap-mac 5869.6c00.a0a3

ap-group jxl_a_1c

ap-config 教A-108

ap-mac 5869.6c00.a0f3

ap-group jxl_a_1c

ap-config 教A-203

sta-limit 256

ap-group jxl_a_2c

ap-config 教A-204

现在仅需要ap-config起头的行,其余行要全部删除,用Vim如下处理:

:g!/^ap-config/d

第1段g后的!代表要搜索那些非指定搜索字符串所在的行,这样很快删除了那些除ap-config起頭之外的所有行。

例4,有以下防火墙脚本:

security-access access_to_2 from zone_16 to default

security-access access_to_3 from zone_17 to default

security-access access_to_4 from zone_18 to default

security-access access_to_5 from zone_19 to default

...

如何将其变为如下形式:

security-access access_to_16 from zone_2 to default

security-access access_to_17 from zone_3 to default

security-access access_to_18 from zone_4 to default

security-access access_to_19 from zone_5 to default

前后数字对调,这项具一定难度的操作,用Vim一样很容易完成:

:g/\(\d\+\)\(.\{-}\)\(\d\+\)/s//\3\2\1/

这里用到\1,\2,\3搜索分组替换,并且用.\{-}代表非贪婪的.*任意字符搜索方式。

综上,限于篇幅,这里虽然举的例子都经过简化,实际工作中,要比上述更复杂,且都很庞大,当处理几十行的文本,与处理上万行的文本相比较时,就更能体会的Vim正则替换的强大之处,极端情况下,它能帮助我们提高上百倍的工作效率,并非枉谈。

猜你喜欢

杂乱编辑器字符串
Make Your Work Do On Time
基于文本挖掘的语词典研究
你距离微信创作达人还有多远?
In My Next Life
车辆段收发车运行图编辑器的设计与实现
Clear Your Mental Space
基于VLIW目标机的ELF二进制编辑器设计与实现
一种新的基于对称性的字符串相似性处理算法
依据字符串匹配的中文分词模型研究
一种针对Java中字符串的内存管理方案