Vim替换


替换

  • 替换命令

    • 指定范围
    • 替换前确认
    • 与上下文相关的替换
  • 模式匹配

    • 用在搜索模式中的元字符
    • POSIX方括号表达式
    • 用在替换字符串中的元字符
  • 替换示例

常用命令(在命令模式下)

命令说明
:g/pattern查找移动到文件中最后一次出现pattern的地方
:g/pattern/p查找并显示文件中包含pattern的地方
:g!/pattern/nu查找并显示文件中不包含pattern的地方,并显示行号
:1,10g/pattern/p查找并显示第1行到第10行之间包含pattern的地方

g不光可以用于全局搜索,也可以用于全局替换

替换命令

编辑文件中已使用过简单的替换命令,如r,R,s,S等;它们只能进行局部等相对小范围的文本替换,如果需要从头到出现的文本一起进行替换,就需要全局替换

:g(global 全局)

:s(substitute 替换)

替换基本命令语法

:[range]s[substitute]/{pattern}/{string}/[flags]
  • range 表示范围 eg 10,20 表示10到20行 % 表示所有
  • pattern 要替换的模式
  • string 替换后的文本
  • flags 替换标志位

    • g(global) 表示全局范围内执行
    • c(confirm) 表示确认,可以确认或者拒绝修改
    • n(number) 报告匹配到的次数而不替换,可以用来查询匹配的次数
:s/old/new/

它会将当前这一行中第一个出现的模式old改为new;斜线/用来分隔命令的各部分

常用命令(在命令模式下)

命令说明
:s/a1/a2/g将当前光标所在行中的所有 a1 用 a2 替换
:n1,n2s/a1/a2/g将文件中 n1 到 n2 行中所有 a1 都用 a2 替换
:%s/a1/a2/g将文件中所有的 a1 都用 a2 替换

指定范围

在:s前面可以加上范围限制

命令说明
:s当前行
:1,10s第1行到第10行
:1,$s第1行到最后一行
:%s可以使用%代替1,$,表示所有行

替换前确认

:1,10s/old/new/gc

当不太确定能否按预期正确替换时,可以在命令结尾加上c选项 代表confirm 确认
如果确定要替换,必须输入y (yes) 再按下回车,如果不想做替换,直接按下回车,即可跳过当前文本,跳转到下一个匹配文本

与上下文相关的替换

:g/pattern/s/old/new/g

简单替换会把所有匹配全部替换成新的文本,有时替换会更复杂一些,比如要替换的字符会出现在很多单词当中;
这种语法是先搜索一个模式,在找到包含模式的某一行时,对另外一个字符old做替换
第一个g告知命令需对文件中所有的行起作用,pattern用于识别发生替换的行,遇到包含pattern的行,old替换成new,g表示在哪一行中做全局替换

模式匹配

在全局替换时,不只可以搜索固定的字符串,也可以搜索可变的模式,也就是正则表达式
正则表达式是将一般的字符与许多特殊的元字符结合起来的表达式

用在搜索模式中的元字符

命令说明
.匹配出任何单一字符(换行符除外),空格也是字符
*匹配出位于此符号前的单一字符,该字符可出现任意次,包括0次
^从行头开始匹配
$匹配位于行尾
\将后面的特殊字符当成一般字符
[]匹配出方括号里的任何一个字符,插入符号^只有位于方括号第一个时才有特殊的意义,表示取反
( )将(与)间的模式保存到保留缓冲区
\< \>会匹配出以某些字符开头(\<)或(\>)结尾的单词,单词的结尾和开头是由标点符号或空格来分隔
~匹配出任何一上次搜索时所使用的正则表达式

POSIX方括号表达式

POSIX方括号表达式,用于比较非英文字母的字符;在方括号表达式中,可以包括:

  • 字符类 包括了用[:与:]括起来的关键字,关键字描述了不同的字符类,包括字母字符,控制字符等等
  • 校对符号 由多字符组成的序列,但必须被当成一个单位,使用[.与.]括起所需字符
  • 等价类 列出了所有应该被当成相等的字符集合 用[=与=]括起来

这三种都必须出现在方括号表达式的方括号中。例如 [[:alpha:]!] 匹配出任何一个字母字符或是感叹号

命令说明
[:alnum:]字母与数字字符
[:alpha:]字母字符
[:blank:]空格与制表符
[:cntrl:]控制字符
[:digit:]数字字符
[:graph:]可打印的与可见的字符 不包括空格
[:lower:]小写字符
[:upper:]大写字符
[:print:]可打印字符 包括空白
[:punct:]标点字符
[:space:]空白字符
[:xdigit:]十六进制数字

用在替换字符串中的元字符

:%s/[ABC]/[abc]/g

希望将ABC换成abc,但是因为在替换字符串中的方括号会被当成一般字符
要解决这个问题,需要一个方式来指定变动的替换字符串

  • \n
利用(与)存储的第n个模式的文字做代换,n表示为数字1-9,而之前存储的模式是从行左至右来计算的
  • \
将后面一特殊字符当成一般字符。反斜线在替换字符串中与搜索模式中同样是元字符。要指定匹配真正的反斜线,需要输入两个\
  • &
用在替换字符串中时,会被替换成搜索模式匹配出的完整文本,这在避免重新输入文本时很有用
  • ~
与使用在搜索模式时的意义类似,找到的字符串会被最后一个替换命令中的替换文本替换
  • \u或\l
使替换字符串中的下一个字符变成大写或小写
  • \U或\L 与 \e或\E
与\u \l 类似,只是所有接在后面的字符都会被转换成大写或小写,一直到替换字符串结束,或出现\e \E为止

所有的模式都对大小写敏感,但是可以在模式中同时指定匹配大写与小写

替换示例

  • 替换所有 time 为 date

:%s/time/date/g

%表示所有,等同于 1,$;s表示替换;g 表示替换全局;

这种替换在实际中往往会误伤,比如datetime :%s/\<time\>/date/g

  • 给脚本中的time加上()号,表示函数调用
:%s/time/&()/g
  • 更改路径

%s//home/tim//home/git/g

如果斜线作为替换文本或模式的一部分时,必须使用反斜线做转义,用/才能得到/

或者使用冒号当作分隔符 :%s:/home/tim:/home/git:g

  • 将单词转换成大写

:%s/[Hh]elp/HELP/g

:%s/[Hh]elp/\U&/g

  • 将多个空格替换成一个空格
:%s/ */ /g
  • 将sh脚本 1-10行注释
:1,10s/^/# /g
  • 为当前行开始后5行添加;

:.,+5s/$/;/g

可不加g,本来就只会有一个结尾

  • 将:或=后面的多个空格换成1个空格

:%s/([:=]) */\1 /g

使用\1表示 (与) 匹配出来的字符

  • 删除空白行

:g/^$/d

:g/^[ ]*$/d

  • 将列调换

:%s/(.) - (.)/\2 - \1/g

- 分隔列,将列调换

  • 将文件的行次序反向

:g/.*/mo0

:g/^/mo0

  • 将以数字开头的行移到文件结束
:g/[0-9]/m$

声明:Rock 版权所有,内容均为原创,欢迎转载。

转载:转载请注明原文链接 - Vim替换


我是一个程序员,致力于网页开发,我还很年轻,什么也不懂。