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

posted on 2012-02-16 14:44  DavidYanXW  阅读(1115)  评论(0)    收藏  举报