zoukankan      html  css  js  c++  java
  • VIM 及正则表达式

    VIM及正则表达式


    一、查找/Search + 统计

    1、统计某个关键字
    方法是:%s:keyword:&:gn
    其中,keyword是要搜索的关键字,&表示前面匹配的字符串,n表示不真正进行替换。有的人说,不加n也可以,不过不加n的话,会修改文件的时间信息,%表示所有行,s表示substitute,g表示global,所在行的所有匹配。

    二、替换与删除/Substitute/Replace & Delete

    1、删除行尾的^M
    The ^M is a carriage-return/CR character. If you see this, you're probably looking at a file that originated in the DOS/Windows world, where an end-of-line is marked by a carriage return/newline pair, namely CR-LF, whereas in the Unix world, end-of-line is marked by a single newline.

    Read this article for more detail, and also the Wikipedia entry for newline.

    This article discusses how to set up vim to transparently edit files with different end-of-line markers.

    If you have a file with ^M at the end of some lines and you want to get rid of them, use this in Vim:

    :%s/^M$//g
    

    **Note: ** (Press Ctrl+V Ctrl+M to insert that ^M.) You can't directly insert ^+M (two characters), which doesn't match the single CR character.另外可以用 (carriage return/車-返/迴)来代替^M

    参考:
    删除行尾的^M

    三、居中光标所在行

    zz 居中光标所在行
    zb zoom base/将光标所在的行跳转到当前页面的最底部
    zt top/将光标所在的行跳转到当前页面的最顶部
    ctrl+b 页面向后退一页/backward
    ctrl+f 页面向前一页/forward

    四、正向预搜索匹配

    五、列模式/Volumn Mode

      1、比如我们经常要用到的注释,也就是在行首添加//(双斜杠)。
      在Windows的GVIM下先按CTRL+Q打开块选择模式,然后按SHIFT+上、下、左、右箭头选择相应的区域,后按下SHIFT+I(Insert)开始插入//,最后按下`(1左边的Escape键)即可。

      :有的时候按下CTRL+V也可以开启选择模式,但是在Windows下CTRL+V用作了粘贴键

    2、在行首添加行号
    比较容易理解的版本:

    1. :%s/^/=printf("%6d ", line('.')) 或者 :%s:^:=printf("%6d",line('.'))

    其中,:(冒号)与/(正斜线)均是作为一个命令的分隔符,后面的(反斜线)是个转义字符。这个printf(formatted print)与C语言中的功能相同,这里的格式%6d,表示输出为6为的10(shí)进制,如果不足6位则在前面用space(空格,Unicode 0x20)填充。line('.'),表示当前行的行号。%代表100%,也就是所有的行。
    另外,这个匹配可以用另外一种方式去理解,^(caret/帽子)符号代表的是行首,我们只要用特定的字符把^(行首)替换了就可以了。

    Note:基于此,那么在行首,添加//注释就非常的简单了。只要[range]s:^://即可,其中[range]表示哪些行,比如在5至7行 de' 行首添加注释,则[range]替换成5,7即可。

    REFER:Inserting Line Numbers into Existing Text

    六、复制/删除

    (1)复制1个单词:yw
      复制n个单词:ynw
    (2)复制1行:yy
      复制n行:nyy
    (3)删除1个单词:dw(delete word);
      删除n个单词:dnw
    (4)删除1行:dd
      删除n行:ndd

    七、匹配中文字符

    中文在不同的字符集编码中的匹配规则也不同,这里说的是UNICODE字符集中汉字的匹配规则。

    UNICODE标准中,中日韩三国的文字通称为CJK象形文字,在UNICODE 6.3标准中占据的编码块有以下几个:
    
    2E80..2EFF; CJK Radicals Supplement 中日韩部首增补
    2F00..2FDF; Kangxi Radicals 康熙部首
    3000..303F; CJK Symbols and Punctuation 中日韩符号和标点
    31C0..31EF; CJK Strokes 中日韩笔画
    3200..32FF; Enclosed CJK Letters and Months 带圈中日韩字母和月份
    3300..33FF; CJK Compatibility 中日韩兼容
    3400..4DBF; CJK Unified Ideographs Extension A 中日韩统一表意文字扩展A
    4DC0..4DFF; Yijing Hexagram Symbols 易经六十四卦符号
    4E00..9FFF; CJK Unified Ideographs 中日韩统一表意文字
    F900..FAFF; CJK Compatibility Ideographs 中日韩兼容表意文字
    FE30..FE4F; CJK Compatibility Forms 中日韩兼容形式
    20000..2A6DF; CJK Unified Ideographs Extension B 中日韩统一表意文字扩展B
    2A700..2B73F; CJK Unified Ideographs Extension C 中日韩统一表意文字扩展C
    2B740..2B81F; CJK Unified Ideographs Extension D 中日韩统一表意文字扩展D
    2F800..2FA1F; CJK Compatibility Ideographs Supplement 中日韩兼容表意文字增补
    

    所以如果使用UNICODE字符集,无论使用何种编码转换格式,当然优先utf-8,就可以使用[uxxxxx-uxxxxx]这种格式来匹配相应的象形文字。对于常用汉字,可以用[u4E00-u9FFF]覆盖,但是这个范围没有标点符号,只能匹配 汉字/Kanji/漢字。[u3000-u303F]也只涵盖一部分 全角标点符号,比如没匹配到全角的逗号。

    例子:
    1、将汉字中间的英文逗号/,替换为中文逗号/,
    方法:

    :%s:([u4e00-u9fa5])(,)([u4e00-u9fa5]):1,3:g
    
    其中,([u4e00-u9fa5])代表1,表示分组1;
    (,)代表2,表示分组2;
    ([u4e00-u9fa5])代表3,表示分组3;
    

    上面的第一个:,表示VIM的命令模式。%表示在整个文件进行操作。 s表示 subsitute/替换()表示一个分组,分组可以用 (n 为1-9)进行代替。
    后面的1,3,表示只将 英文逗号, 替换为 中文逗号,另外的第1和第3组模式保持不变,g表示对某一行里面的所有匹配,不加g表示只替换所在行的第一个。

    2、将( 汉字汉字汉字 ) 替换为 (汉字汉字汉字)。即,将英文括号换成中文的括号,并去掉汉字两边的空格。

    :%s:((s=)([u4e00-u9fa5]+)(s=)):(2):g
    

    解释:将左括号(英文)和左边的空格 分到第1组,中间的汉字为第2组,汉字后的 空格+括号 为第3组。

    八、全选、全部复制

    1、gg+V+G 全选
    gg跳到第1行;V 选择模式;G(Shift+g),跳到最后一行;
    2、gg+V+G+y 全选复制
    3、复制n-m行
    ngg+V+m+gg+y
    n+gg,跳转到第n行;m+gg跳转到第m行;V,选择;y-yank复制;

    参考


    1、Search and Replace
    2、VIMDoc
    3、VIMRegex
    4、VIMTips
    5、China Unix VIM 中文
    6、vim:匹配中文的正则表达式

  • 相关阅读:
    静态(static)代码块、构造代码块、构造函数、父类子类执行顺序
    Java基本特征
    下列哪项不属于jdk1.6垃圾收集器?
    Model-View-Controller(MVC) is an architectural pattern that frequently used in web applications. Which of the following statement(s) is(are) correct?
    ServletConfig对象详解
    ServletConfig接口默认是哪里实现的?
    eclipse根据父类打开子类快捷键
    IDE:Eclipse查看Servlet源码
    IDE:Eclipse查看接口实现类快捷键
    Qt探索之路——多线程实现方法
  • 原文地址:https://www.cnblogs.com/xuanyuanchen/p/5786162.html
Copyright © 2011-2022 走看看