IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

使用Vim(gvim)实现复杂的查找替换的一个例子

Vimer 2009-12-18 23:31:25 累计浏览 3,801 次
本机暂存

今天老婆在整理文档的时候希望能快捷的排版某些格式,无奈发现word并不能满足要求,所以就让我用Vim试一下。
问题如下:

1 加州大学伯克利分校 University of California Berkeley 
2 加州大学洛杉机分校 University of California Los Angeles 
3 威斯康星大学麦迪逊分校 University of Wisconsin Madison
4 康乃尔大学 Cornell University 
=伊利诺伊大学厄本那―香槟分校 University of Illinois Urbana Champaign
6 卡内基美隆大学 Carnegie Mellon University 
=斯坦福大学 Stanford University 
=芝加哥大学 The University of Chicago

上面的文字都是用空格隔开的,现在希望拆分成三列,即数字一列,中文一列,英文一列,中间用tab键隔开,因为这样拷贝到excel中的时候直接就是3列。
考虑的步骤如下:

1.把=替换成上面一行的那个数字。
2.把最后一个数字后面的空格替换成tab
3.把最后一个中文字符后面的空格替换成tab。

OK,思路是这样的,在我们继续之前,我们还是先回顾加了解一些东东:

匹配数字:\d
匹配非数字:\D
匹配任意中文字符:[^\x00-\xff]
匹配非中文字符:[\x00-\xff]

好,知道了这些之后,我们开始~~

第一步:

%s/^\(\d\+\)\(\s.*\n\)=/\1\2\1 /gc

或者

%s/^\(\d\+\)\(\s.*\n\)\(=\)\(.*$\)/\1\2\1 \4/gc

这个命令实现了匹配一行之后的第一个=,并将其替换为上一行的数字,需要说明的就是\(\)中的内容,会被作为\1\2\3这样来标识,可以避免替换掉不想替换的内容。
这个命令只能实现匹配紧跟行后的第一个=,所以如果有多个=的话,需要执行多次。
还有就是,你会发现我在被替换的内容中,空格使用\s的,但是在替换的内容中,我是直接用了空格,貌似在后面的部分里不支持转义,所以只能用原来的字符-即空格。

第二步:

%s/\(\d\+\)\s/\1\t/gc

这个也比较简单,就是实现了最后一个数字后面的空格替换为tab(\t),我也不知道为啥\t在这里可以转义,但是上面的\s却不可以呢

最后一步:

%s/\([^\x00-\xff]\+\)\s/\1\t/gc

这里用到了上面提到的中文字符的匹配,实质上和第二步是一样的~~
OK,到了这里就全部结束啦,让我们看看最后的结果:

1 加州大学伯克利分校 University of California Berkeley 
2 加州大学洛杉机分校 University of California Los Angeles 
3 威斯康星大学麦迪逊分校 University of Wisconsin Madison
4 康乃尔大学 Cornell University 
4 伊利诺伊大学厄本那―香槟分校 University of Illinois Urbana Champaign
6 卡内基美隆大学 Carnegie Mellon University 
6 斯坦福大学 Stanford University 
6 芝加哥大学 The University of Chicago

OK,完全符合要求~~
附件中是写的脚本,按下F9就可以执行。(由于考虑到实际问题,第一步中仅把=替换为0 )
脚本下载

同分类推荐文章

  1. 科技爱好者周刊(第 401 期):如何赚到10亿美元 (2026-06-26 08:05:38)
  2. 如何做决策 - 从 Go 的一个 issue 说起 (2026-06-26 08:00:00)
  3. Seven Player:Windows上播放115网盘视频的增强工具 (2026-06-09 00:06:47)

查看更多 开发者 文章 →

建议继续学习

  1. vim几个小技巧(批量替换,列编辑) (累计阅读 37,515)
  2. 简明Vim练级攻略 (累计阅读 22,271)
  3. Vim下的代码自动补全和代码跳转阅读 (累计阅读 15,346)
  4. 为什么要用 Emacs/Vim,而不是任何其他编辑器 (累计阅读 13,016)
  5. 高效Linux用户需要了解的命令行技能 (累计阅读 12,822)
  6. vim入门,进阶与折腾 (累计阅读 10,779)
  7. 在vim(gvim)中运行终端(对,你没有看错,我也没有写反) (累计阅读 10,742)
  8. perl更新/修改/删除文本文件内容 (累计阅读 10,646)
  9. 让vim在终端下的配色亮起来! (累计阅读 10,062)
  10. AWK 简明教程 (累计阅读 9,363)