vim之正则替换实践
场景: 有一个html页面的table表格, 需要转换成csv表格.
html源文件如下:
<table><tr><td>序号</td><td>ID</td><td>CID</td></tr>
<tr>
<td>1</td>
<td>018011005</td>
<td>100012</td>
</tr>
<tr>
<td>2</td>
<td>018011001</td>
<td>100012</td>
</tr>
<tr>
<td>3</td>
<td>018011009</td>
<td>100012</td>
</tr>
<tr>
<td>4</td>
<td>018011003</td>
<td>100012</td>
</tr>
<tr>
<td>5</td>
<td>018011010</td>
<td>100012</td>
</tr>
<tr>
<td>6</td>
<td>018011007</td>
<td>100012</td>
</tr>
<tr>
<td>7</td>
<td>018011004</td>
<td>100012</td>
</tr>
<tr>
<td>8</td>
<td>018011006</td>
<td>100012</td>
</tr>
</table>
正则替换步骤如下:
1. 替换table标签:
:%s/<table>//
:%s/<\/table>//
2. 删除只有空白的行:
:g/^\s*$/d
3. 删除行开头的空格:
:%s/^\s*//g
4. tr内的td数据合并到一行(替换为逗号):
:%s/<\/td>\n<td>/,/g
5. 替换tr标签:
:%s/<tr>//g
:%s/<\/tr>//g
6. 再次删除空行:
:g/^\s*$/d
7. 先处理表头:
:1s/<\/td><td>/,/g
8. 删除第一个逗号前的数据:
:%s/.\{-},//
:%s/.*,// (错误的命令,会删除第二个逗号前的内容,因为 .*是贪婪模式,会尽量多的匹配逗号)
9. 删除行结尾的td标签
:%s/<\/td>//g
[替换完成]
替换完后的文件内容如下:
ID,CID
018011005,100012
018011001,100012
018011009,100012
018011003,100012
018011010,100012
018011007,100012
018011004,100012
018011006,100012
参考资料:
如何匹配一对双引号之间的所有空格? http://www.douban.com/group/topic/4116145/
VIM中换行符的查找与替换之迷 http://hi.baidu.com/leejun_2005/blog/item/4bb4654f152e8f12b2de0517.html
vim正则表达式 http://be-evil.org/post-213.html
(转载)vi使用小技巧 http://hi.baidu.com/skilfan/blog/item/4a5dc613e3552523dd54018a.html
vim&gvim技巧大全 - 正则操作技巧(2) http://hi.baidu.com/xhl_tips/blog/item/c2515fd0b7b6888aa1ec9c55.html
vim查找替换小结 http://nodex.iteye.com/blog/360709
浙公网安备 33010602011771号