vim搜索和替换

目录

  • 正则表达式
    • 1.特殊字符
    • 2.字符类(character-classes)
    • 3.规则
    • 4.交替和分组
    • 5.量词(quantifier)和重数(multi)
      • 贪婪模式(greedy)
      • 非贪婪模式(non-greedy)
    • 6.魔法(magic)详解
      • 6.1.基本魔法(magic)
      • 6.2.无魔法(no magic)
      • 6.3.深度魔法(very magic)
    • 7.正则表达式举例
      • 7.1.精确匹配单词
      • 7.2.变量,方法或类的重命名
    • 7.3.函数参数的重排列
  • 用参数列表处理多个文件
    • 命令
    • 举例
      • update
  • 行内搜索
    • 替换字符串
  • 搜索命令
    • 1.grep
    • 2.vimgrep
    • 3.ack
  • 替换命令
    • 命令形式
    • 举例
    • 转义

正则表达式

1.特殊字符

符号 说明 注释
. 任意字符,但不包括行尾
^ 行首
$ 行尾
\_ 任意字符,包括行尾
\< 单词开始
\> 单词结尾
#完整列表
:help ordinary-atom

2.字符类(character-classes)

符号 说明 注释
\s 一个空白字符(包括Tab和Space)
\d 一个数字
\w 一个单词
\l 一个小写字符
\u 一个大写字符
\a 一个字母
  • 大写反类
  • :help character-classes

3.规则

  1. [] - 字符集合,例如[A-Z0-9],[,4abc]
  2. [^] - 补集,例如[^0-9A-Za-z]

4.交替和分组

符号 说明 注释
| 交替(alternation)
\(\) 分组(grouping) 将多个字符放在一组
#同时匹配carrot和parrot
carrot\|parrot
#分组和其他正则表达式组合使用
\(c\|p\)arrot

#分组匹配到的字符串还可以在后面的替换中重用
#'cat hunting mice'替换成'mice hunting cat'
:s/\(cat\) hunting \(mice\)/\2 hunting \1/

5.量词(quantifier)和重数(multi)

字符或字符区间后面接量词,也称为重数.

符号 说明 注释
* 0或多个 贪婪匹配模式
\+ 1或多个 贪婪匹配模式
\{-} 0或多个 非贪婪匹配模式
\?或\= 0或1个 贪婪匹配模式
\{n,m} n~m个 贪婪匹配模式
\{-n,m} n~m个 非贪婪匹配模式
#量词的完整列表
:help multi

贪婪模式(greedy)

尽可能多地匹配字符

非贪婪模式(non-greedy)

尽可能少地匹配字符

#匹配一个或多个单词
\w\+

#匹配2-4个连续的字符a
a\{2,4}

#对于字符串'foo2bar2'

#匹配'foo2bar2'
\w\+2

#匹配'foo2
\w\{-1,}2

6.魔法(magic)详解

6.1.基本魔法(magic)

  • 默认模式
  • .和*之外,大部分特殊字符都需要转义
  • 显式设置:在正则表达式字符串前加上\m,例如/\mfoo或者:s/\mfoo/bar.

6.2.无魔法(no magic)

  • 所有特殊字符都需要转义,例如:在基本魔法时/^.*$,无魔法时为/\^\.\*\$
  • 显式设置:在正则表达式字符串前加上\M
  • .vimrc中设置:set nomagic,最好不要这样设置

6.3.深度魔法(very magic)

  • 将数字,字母,下划线之外的字符都视为特殊字符
  • 显式设置:在正则表达式前加上\v
  • 使用场合:特殊字符比较多
#将'cat hunting mice'替换成'mice hunting cat'

#基本魔法
:%s/\(cat\) hunting \(mice\)/\2 hunting \1/g
#深度魔法
:%s/\v(cat) hunting (mice)/\2 hunting \1/g

7.正则表达式举例

7.1.精确匹配单词

#精确匹配单词
#搜索animal
#	/ - 正向搜索
#	\< - 单词开始
#	animal - 搜索的单词
#	\> - 单词结尾
/\<animal\>

7.2.变量,方法或类的重命名

#1.
:arg **/*.py

#2.把光标移动到需要重命名的类上

#3.
#[ctrl+r,ctrl+w]是快捷键,将光标下的单词插入当前命令中
:argdo %s/\<[ctrl+r,ctrl+w]\>/Pitbull/gec | update
#或者
:argdo %s/\<Dog\>/Pitbull/gec | update

#4.
#y同意,n拒绝

:args

#先查看文件
:vimgrep /\<Dog\>/ **/*.py
:cn
:cp
:copen

7.3.函数参数的重排列

:arg **/*.py
#"\v\(" 完整匹配 "act("
#'(\w{-1,}), ([^,]{-1,})\)' 匹配 'group1, group2)'
:argdo %s/\v<act>\((\w{-1,}), ([^,]{-1,})\)/act(\2, \1)/gec |update

用参数列表处理多个文件

(argument list, arglist)

支持多个文件执行同一操作.

每个参数列表项都在缓冲区列表中,但不是每个缓冲区都在参数列表中.

命令

命令 说明 注释
:arg 定义参数列表
:argdo 对参数列表中的所有文件执行一条命令
:args 显示参数列表中的文件列表

举例

:arg **/*.py
#update 等价于 :write,用于保存被修改过的缓冲区
:argdo %s/\<animal\>/creature/ge | update
:args

update

vim切换缓冲区时推荐保存当前缓冲区.

另一种方案

#隐藏警告
:set hidden
#保存所有
:wa

行内搜索

命令 说明 注释
t 后面接一个字符,用于当前行内搜索,光标在字符之前 until
T T反向
f 后面接一个字符,用于当前行内搜索,光标在字符之上 find
F F反向
; 重复下一个
, 重复上一个

替换字符串

vim中替换字符串的方法有哪些

:%s/str1/str2/g

搜索命令

命令 说明 注释
/关键字 正向搜索
?关键字 反向搜索
n 下一个 next
N 上一个
* 搜索光标下的单词
:nohlsearch 关闭搜索高亮 单次
:grep 跨文件搜索
:vimgrep 跨文件搜索
:ack 跨文件搜索

1.grep

2.vimgrep

:vimgrep <模式> <路径>

#参考2.5.2 用/和?搜索
#当<路径>为"**"时,表示对目录进行递归
:vimgrep animal **/*.py

#在不打开 quickfix,快速浏览quickfix
#下一个
:cn
:cnext
#上一个
:cp
:cprevious
:cN

#打开quickfix列表
:copen
jk #上下移动
enter #打开
#退出quickfix
:q
ctrl+w,q

3.ack

sudo apt install ack-grep

Beyond grep: https://beyondgrep.com/

#递归搜索所有包含Animal的python文件
ack --python Animal

#安装插件ack.vim后,在vim中执行,搜索结果显示在quickfix中
:Ack --python Animal
#注意第一个字母需要大写

替换命令

命令形式

#搜索和替代
:substitute
:<作用范围>s/<find-this>/<replace-with-this>/<flags>

#flags:可以结合起来使用(除了i和I之外)
#	g - 全局替换
#	c - 每次替换前需要确认
#	e - 没有匹配项时不显示错误
#	i - 忽略大小写
#	I - 区分大小写

#作用范围
#	% - 整个文件,替换完后,在状态栏显示多少个被替换
#	数字 - 表示行号
#	$ - 最后一行
#	/search-pattern/ - 搜索结果所在的行
#	?backwards-search-pattern? - 反向搜索结果行
#	; - 区间范围组合起来,例如17;$表示从17行到最后一行

举例

#使用cat代替首个dog
#没有指定范围
:s/cat/dog

#整个文件全部匹配项代替,忽略大小写
:%s/cat/dog/gi

#整个文件全部匹配项代替
:%s/java/python/g

#作用范围:12行开始 - 搜索到dog为止
#此范围内匹配项全部替换
:12;/dog/s/animal/creature/g

#可视模式下,选择区域作为作用范围
#此范围内匹配项全部替换
:s/cat/dog/g

转义

  • 转义 - 避免与替换命令的分隔符混淆
  • 修改替换命令的分隔符 - 避免混淆
#两种方式等价
#1.替换命令分隔符被修改为+
:s+path/to/dir+path/to/other/dir+gc
#2.使用\/转义
:s/path\/to\/dir/path\/to\/other\/dir/gc

你可能感兴趣的:(vim,vim,chrome,编辑器)