利用: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)?
这时你可以做出以下回答:
- y Yes:执行这个替换
- n No:取消这个替换
- a All:执行所有替换而不要再询问
- q Quit:退出而不做任何改动
- l Last:替换完当前匹配点后退出
- CTRL-E 向上翻滚一行
- CTRL-Y 向下翻滚一行
指定范围
如果没有在命令中指定范围,那么将只会在当前行进行替换操作。以下命令将把当前行中的I替换为We。命令中的/i标记,用于指定区分大小写。
:s/I/We/gi
以下命令将文中所有的字符串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
以下命令指定只在后续9行内进行替换:
:.,.+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
vim 有辦法像sed 一樣用;隔開執行嗎?
回复删除sed -e 's/^M//g ; s/^/# /'
失敗
:'<,'>s/$^M//g/;/s/^/# /g
Bash: Split a string into an array - Stack Overflow^M
http://stackoverflow.com/questions/14401719/bash-split-a-string-into-an-array^M
常看你的文章,特别好。
回复删除帮经常看你的文章,学了特别多东西,特别棒!
回复删除感谢鼓励。大家共同学习哈。
回复删除真好
回复删除