Vim 高级用法

与正则表达式的结合

正则表达式绝对是计算机科学的一项伟大发明,在文本编辑、编写代码乃至文件批量重命名上,都能带来效率的极大提升。我们常用的 grep 命令的名称由来(Global search for Regular Expression and Print matching lines)就跟正则表达式息息相关,如果你经常使用 grep 却还没有掌握正则表达式,那就真是辜负了 grep 作者的用心良苦。

正则表达式的主要用法就是匹配字符,在 Vim 中主要体现在复杂字符串的查找与替换上,说几个用法:

  1. 搜索分组:
    假如遇到这样的一堆文件名,想批量把日期格式 yyMMdd 改成 yy-dd-MM 咋办?

    161201.mp3
    161202.mp3
    161203.mp3
    161206.mp3
    161207.mp3
    ...
    

    直接上答案:

    :%s/\(\d\d\)\(\d\d\)\(\d\d\)/\1\-\3\-\2
    

    就变成了:

    16-01-12.mp3
    16-02-12.mp3
    16-03-12.mp3
    16-06-12.mp3
    16-07-12.mp3
    ...
    

    这里用到了 () 分成 3 组,然后重新排序。因为都是特殊字符,所以用了很多 \ ,希望各位不要看晕了。

  2. 贪婪与非贪婪:

    123abcdefc789
    

    如上字符串,如果是 ab.*c 就是贪婪匹配,如果是 ab.\{-}c 就是非贪婪。例如:

    :s/ab.*c/456        // 结果是 ‘123456’
    :s/ab.\{-}c/456     // 结果是 ‘123456defc789’
    

    注:在 Vim 中非贪婪的用法是 .\{-} 而不是标准正则表达式中的 .*? ,需要注意一下。

  3. 与或非:

    /.*red\&.*blue     // 匹配同时包含 red 与 blue 的一行
    /abc\|123          // 匹配 abc 或者 123
    :s/ab[^c]*/456     // 结果是 '123456cdefc789',即匹配所有不为 `c` 的字符,直到遇到第一个 `c` 为止。
    
  4. 反向肯定预查搜索:
    /\(exp1\)\@<=exp2 即首先搜索 @<= 右侧的原子 exp2,遇到匹配项后再检查匹配结果左侧是否满足 exp1。

    1.000200 1.0002000300
    :s/\(\.\d\+\)\@<=0\+\>//g		// 结果是 ‘1.0002 1.00020003’
    

    注:在 Vim 中匹配边界是 \> 而不是标准正则表达式中的 \b ,需要注意一下。

你可能感兴趣的:(善用佳软)