您的位置:首页 > 其它

[倚天屠龙记] vim 查找与替换(简单替换)

2015-06-06 16:11 316 查看
[倚天屠龙记] vim 查找与替换(简单替换) {{{

厌倦了小说式的叙述方式,现在换一种方式来总结vim的替换功能,跟查找一样,本文只讲述最基本的替换,不牵扯到正则表达式,相关的帮助文档是:help :s。



最简单的替换命令是r,它只替换光标处的一个字符,这最适用于更正拼写错误,例如要将bay修正为boy,只需要将光标放在字符a上,按r,再按o即可,这个操作自始至终都处于命令模式中,不会进入插入模式。

改写命令c用来修改已经存在的文本,在其后面跟上光标移动指令,就w会进入到插入模式将从光标当前位置到目标位置的文本全部重写,例如c$会删除从光标当前位置到行尾的文本然后进入插入模式等待输入替换的内容。命令cc修改当前行的内容。

vim中用于替换的通用命令如下:

:[range]s/{pattern}/{string}/[flag]

这个命令中,用中括号括起来的部分是可以省略的,也就是拥有默认值,用大括号括起来的部分是一般是需要指定的,以下介绍各个部分的意义。

s是命令名称,它的全写是substitute,命令中也可以用全写的形式,但我想应该没有人会愿意用。

range是替换命令的执行范围,pattern是用于搜索匹配的模式串,string是用来替换旧内容的字符串,flag是控制参数,包括替换确认、大小写敏感、计数等开关。如果要将光标所在行中for全部更改为For的命令是:s/for/For/g,这里省略了范围,默认的范围是光标所在的行,提供的控制参数是g,它是global的简写,意思是替换当前行中每一处for的出现,如果没有指定g参数,则仅仅替换当前行中第一次出现,所以这个参数通常都是要加的。

flag是替换的控制参数,g表示替换行内的每一处出现,i则表示在匹配时忽略大小写,c表示需要逐个确认是否替换,在查找到每一个模式串的出现时,vim都会停下来询问是否需要进行替换,n表示只报告需要替换多少处而不执行替换,这在简单查找一节已经介绍过如何统计一个模式串在文件中的出现次数,用的就是这个选项。

替换的范围如果没有指定,则仅限于光标所在的行。要指定在某一行内进行替换,则直接用行号作为范围即可,例如:20s/for/For/表示将当前文件第20行的for第一次出现替换为首字母大写的形式。要指定起始行号和结束行号之间的范围则用逗号分隔,:s10,20s/for/For/g表示将第10行(含)到第20行(含)中的for全部替换为For,如果担心这个替换还会将forever替换成Forever,则可以指定整词匹配,只要在模式串两端加上单词开始和结束标记即可:10,20s/\<for\>/For/g。如果要全文替换,可以直接用%代表(还记得百分号寄存器中存储的是当前文件的名称吗?),实际上这只是一个简写,完整的写法是\%^,\%$,逗号的两端分别匹配文件头和文件尾。如果要在选中的一段文本中进行替换,则范围是\`<,\`>,实际上这个不用你手工输入,在visual-mode模式下选择一段文本后,按下冒号后,vim会自动将这个范围填上。

要说明的一点是,替换命令中使用了左斜杠来分隔命令的各个部分,如果你的搜索内容或者替换的内容中也包含了左斜杠,你就必须使用反斜杠去掉它的转义,比如你要将 SIP/2.0 替换成 SIP/5.0,命令应该写成这样:%s/SIP\/2.0/SIP\/5.0/g。如果你的文本中左斜杠出现了不只一次,你可以在替换命令中使用#来分隔命令的各个部分,这时左斜杠将被视为一个普通字符而不是用来分隔命令的各个部分,也就是写成:%s#SIP/2.0#SIP/5.0#g,两者完全等价,同样,如果你的搜索和替换的内容中出现了井号,你也可以换用左斜杠来作命令中的分隔符,要是你的搜索替换内容很不幸的同时出现了左斜杠和井号,出现次数不多的情况下你可以使用反斜杠来进行转义,要是更不幸的出现了很多次,vim表示既然你的需求如此的奇特,你应该不介意使用我提供的escape函数和表达式寄存器吧,在替换命令中输入:%s/之后需要输入搜索内容时,按下双引号和等号,调出表达式寄存器,仍以上述替换为例,输入函数
escape("SIP/2.0" '/')按回车,这个函数的返回值就是 SIP\/2.0,自动出现在搜索字符串的位置,即它可以将字符串中的指定特殊字符取消其转义,同样可以输入需要替换的内容。

}}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: