some vim usage

Jan 19, 2019 • moontree


  • 查找关键字并计数

    :%s/keyword//gn

  • 查找关键字并删除对应行

    :g/keword/d

  • 删除不包含关键字的行:

    :v/keword/d

  • 删除重复行

    :sort

    g/^\(.\+\)$\n\1/d

  • 删除所有行

    :0

    :.,$d

  • 查找关键字并复制对应行到新文件:
      " Clear register A
      :let @a=""
      " Append all lines which matchs book to register A
      :g/keword/y A
      " Open a new file
      :new filename
      " Paste content of register A into the new file
      :put a
    

    也可以先新建一个文件,比如`res.txt’,然后用如下命令完成:

      g/keyword/. w >> res.txt
    
  • 正则相关: 原始文件如下所示:
      1,eteatte,f312efa
      2,fafefa,fawea
      ……
      1000, ffafef
    

    想把上面文件中的行首序号后面的’,’替换为’#’,求助于正则匹配的方式:

      :%s/^\(\d*\),/\1#/g
    

    :%s/old_string/new_string/g为替换的命令,但是由于其他地方也包含逗号,直接用这个命令并不合适。 我们需要的是匹配行首的数字后面的逗号,然后保留数字,将逗号替换掉,这还需要在后面用到匹配到的数字。

    • ^表示行首匹配
    • \d*表示匹配任意数字
    • \( \) 之间包含的,可以在后面用\1 \2来获取匹配到的值。 因此,用上述命令可以完成对应的替换。

附:vim中的正则

单个字符,如果要查找字符 * . /等,则需要在前面用 \ 符号,表示这不是元字符,而只是普通字符而已。

元字符 说明
. 匹配任意一个字符
[abc] 匹配方括号中的任意一个字符。可以使用-表示字符范围,
[a-z0-9]匹 配小写字母和阿拉伯数字。
[^abc] 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。
\d 匹配阿拉伯数字,等同于[0-9]
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
\x 匹配十六进制数字,等同于[0-9A-Fa-f]
\X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
\w 匹配单词字母,等同于[0-9A-Za-z_]
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
\t 匹配字符。
\s 匹配空白字符,等同于[ \t]
\S 匹配非空白字符,等同于[^ \t]

表示数量的字符:

元字符 说明
* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个

表示位置的字符:

元字符 说明
^ 行首
$ 行尾
\< 单词词首
\> 单词词尾

高级用法:

  • 在正规表达式中使用 \(\) 符号括起正规表达式,即可在后面使用\1\2 等变量来访问 \(\) 中的内容。
  • 在替换命令 s/// 中可以使用函数表达式来书写替换内容,格式为:s/替换字符串/\=函数式
  • 在函数式中可以使用 submatch(1)submatch(2) 等来引用 \1\2 等的内容,而submatch(0)可以引用匹配的整个内容。