星期六, 十月 08, 2011

VIM学习笔记 替换(Substitute)

利用: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命令在选中的范围内进行文本替换。

Substitute_VisualMode

精确替换

在搜索sig时,也将匹配sig, signature, signing等多个单词。如果希望精确替换某个单词,可以使用“\<”来匹配单词的开头,并用“\>”来匹配单词的结尾:

:s/\<term\>/replace/gc

多项替换

如果想要将单词KangKodos都替换为alien,那么可以使用|进行多项替换。

:%s/Kang\|Kodos/alien/gc

变量替换

使用以下命令可以将文字替换为变量的内容:

:%s!\~!\= expand($HOME)!g

Substitute_ExpandVar

Ver: 1.1<上一篇 | 目录 下一篇>

5 条评论:

  1. 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


    回复删除
  2. 常看你的文章,特别好。

    回复删除
  3. 帮经常看你的文章,学了特别多东西,特别棒!

    回复删除
  4. 感谢鼓励。大家共同学习哈。

    回复删除