论文部分内容阅读
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正则替换的强大之处,极端情况下,它能帮助我们提高上百倍的工作效率,并非枉谈。
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正则替换的强大之处,极端情况下,它能帮助我们提高上百倍的工作效率,并非枉谈。