今天老婆在整理文档的时候希望能快捷的排版某些格式,无奈发现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 )
脚本下载

版权所有,转载请注明出处.http://www.vimer.cn

vim(gvim)正则表达式查找替换(7)-结合vim脚本

《vim(gvim)正则表达式查找替换》是个比较久的系列了,这次因为博友niejieqiang的一个问题,所以决定继续在写一篇,而主题就是将正则表达式查找替换与vim脚本...

阅读全文

vim(gvim)正则表达式查找替换(6)-压缩(删除)重复行

之前有用正则表达式写过一个重复两行压缩成一行的命令,今天我们来看一个讲重复多行压缩成一行的命令。 首先,我们先考虑怎么查出多个重复行。 有两种方法,...

阅读全文

vim(gvim)正则表达式查找替换(4)-生成连续数字或行号

在excel中,提供了一个功能可以根据第一个数字下拉生成一串连续的数字,那么在vim中能不能生成呢?答案是肯定的,而且方法不只一种,而且灵活性更高。 第一种...

阅读全文

12则回应给“使用Vim(gvim)实现复杂的查找替换的一个例子”

  1. 问题说道:

    博主
    我的VIM不知为何映射无效
    应该也没什么程序占用这些键
    map 可以看到映射内容,可是就是无效

    [回复]

    Dante 回复:

    呃,能把你映射键的命令贴一下不?

    [回复]

  2. 问题说道:

    imap
    还打算映射之类的,可是都无效
    其他的都还可以,就是这几个

    [回复]

  3. 问题说道:

    恶,你的博客也很怪异,我输入了映射可是消失了
    无效的几个是
    ctrl-.
    ctrl-,
    ctrl-’
    ctrl-;
    当然ctrl-shift-,之类也是无效的

    [回复]

    Dante 回复:

    呃,wordpress的确存在转义的问题,到现在也没有找到好的解决办法,要不你发到我邮箱里来吧,这样写实在是看不懂……

    [回复]

    吴叔 回复:

    好像wp有个评论贴代码的插件..具体名字忘了.

    [回复]

    Dante 回复:

    这个确实比较头疼,评论中的代码格式都会被去掉。。。

    [回复]

  4. 无限说道:

    vim的正则替换
    前后两个部分 指代确实有不同
    博主提到的\s就是一例
    另一例是换行 在查找部分用 \n 在替换部分用\r
    http://jyf-code.googlecode.com/svn/trunk/funny/regex/ 这里有一些例子

    [回复]

    Dante 回复:

    呵呵,多谢指教啊,那个网址我去看了一下,有很多经验啊,呵呵~~

    [回复]

  5. Yggdroot说道:

    awk处理这种需求最合适

    [回复]

  6. zou说道:

    博主,你的脚本在mac 上测试提示错误哦

    [回复]

    朱念洋 回复:

    提示什么错误?

    [回复]

发表评论