利用:substitute
命令,可以将指定的字符替换成其他字符。通常,我们会使用命令的缩写形式:s
,格式如下:
:[range] s/search/replace/[flags] [count]
其中,range是指定范围,也就是在哪些行里做替换。而后是将字符串from替换成字符串to。
在默认情况下,替换命令仅将本行中第一个出现的的字符替换成给定字符。如果我们想要将所有出现的字符都替换成给定字符,可以在命令中使用g(global)标记:
:%s/from/to/g
其他的标记(flags)包括:p(print),是要求打印所做的改动;c(confirm),是要求在做出改动以前先询问;i(ignorecase),是不区分大小写。我们可以组合使用标记,比如以下命令,将会显示将要做改动的文本并要求确认:
:1,$ s/Professor/Teacher/gc
replace with Teacher (y/n/a/q/l/^E/^Y)?
这时你可以做出以下回答:
如果没有在命令中指定范围,那么将只会在当前行进行替换操作。以下命令将把当前行中的I替换为We。命令中的/i标记,用于指定区分大小写。
:s/I/We/gi
可以在命令指定行号,例如以下命令将在第7行进行替换:
:7s/Windows/Linux/
可以在命令中,使用“$”指代文件末尾,使用“.”指代当前行,并与行号组合以指定替换范围。
以下命令将文中所有的字符串idiots替换成managers:
:1,$s/idiots/manages/g
通常我们会在命令中使用%指代整个文件做为替换范围:
:%s/search/replace/g
以下命令指定只在第5至第15行间进行替换:
:5,15s/dog/cat/g
以下命令指定只在当前行在内的以下4行内进行替换:
:s/helo/hello/g4
以下命令指定只在当前行至文件结尾间进行替换:
:.,$s/dog/cat/g
以下命令指定只在当前行以及后续8行内进行替换:
:.,.+8s/dog/cat/g
你还可以将特定字符做为替换范围。比如,将SQL语句从FROM至分号部分中的所有等号(=)替换为不等号(<>):
:/FROM/,/;/s/=/<>/g
在可视化模式下,首先选择替换范围, 然后输入:
进入命令模式,就可以利用s
命令在选中的范围内进行文本替换。
在搜索sig时,也将匹配sig, signature, signing等多个单词。如果希望精确替换某个单词,可以使用“\<”来匹配单词的开头,并用“\>”来匹配单词的结尾:
:s/\<term\>/replace/gc
如果想要将单词Kang和Kodos都替换为alien,那么可以使用|
进行多项替换。
:%s/Kang\|Kodos/alien/gc
使用以下命令可以将文字替换为变量的内容:
:%s!\~!\= expand($HOME)!g