行内搜索

行内搜索,也就是在当前行内进行搜索和移动,通常都与编辑命令一起使用。

  • fx -- 移动到下一个字符x的位置,光标停留在x字符上面
  • tx -- 移动到下一个字符x的位置,光标停留在x前一个字符上
  • Fx -- 移动到前一个字符x的位置,光标停留在x字符上面
  • Tx -- 移动到前一个字符x的位置,光标停留在x后一个字符上
  • ; -- 重复前一个搜索,向着同一方向,即原来向前就向前,原来向后就向后
  • , -- 重复前一个搜索,向着反方向

行内搜索通常与编辑一起使用:

  • dfx/dtx -- 删除到下一个字符x
  • yfx/ytx -- 复制到下一个字符x

全局搜索

搜索,分为二个部分:一个是搜索命令,另一个是模式匹配;搜索命令就是各个编辑器所支持的启动搜索的方式,比如Windows的各种编辑器都是以对话框的形式。模式就是在对话框中输入的要匹配的字串集。本身字串的匹配功能有限,所以就有了专门用于模式匹配的正则表达式,它描述了模式匹配的一些规则,使用这些规则可以让匹配更加的强大和精准,多数编辑器都支持正则表达式,Vim也不例外,先讲一下搜索命令,然后再讲对正则表达式的支持。

基本搜索命令

  • /pattern -- 向前搜索pattern,光标停留在第一个匹配的第一个字符上面。向前的意思是向下,或者向着行数增加的方向。Vim会亮显示所有的匹配,并将光标停留在当前位置的下一个匹配的首字符上
  • / -- 当不提供pattern时,会向前重复搜索上一个pattern,也就是向前重复搜索的意思,光标会跳到下一个匹配上面
  • ?pattern -- 与/pattern类似,只不过它是向后搜索,向着行数减少的方向。
  • ? -- 与/类似,是不过是向后重复搜索
  • n -- 向着同一方向重复搜索,原来向前就继续向前,原来向后就继续向后(当向前搜索时与/一样,当向后搜索时与?一样)
  • N -- 向着反方向重复搜索,原来向前就向后,原来向后就向前(向前时?一样,向后时/一样)
  • * -- 向前搜索光标所在的单词,只匹配整个单词,单词的定义是一串连续的字母,数字,标点,空白都是单词的分隔符。
  • # -- 向后搜索光标所在的单词,只匹配整个单词
  • /?+上下方向键 -- 像其他的命令提示符一样,方向键可以方便的引用历史搜索记录如,搜索记录为error, grape, that,那么按了/后,再按向上方向键:/that,再向上:/grape,向下:/that,再次按回车就可以搜索了。

正则表达式

如前提及,模式匹配在搜索当中有重要的作用。正则表达式(Regular Expression)是专门用于描述搜索中的(Pattern)模式的。使用正则表达式来构建pattern可以让搜索更加强大和精准。有关正则表达式的详细内容可以参阅《Mastering Regular Expression》这本书。正则表达式仅是一种规范,但是各种常用的工具和编程语言都对正则表达式有不同程度的支持。正则表达式有二类:一是正常的字符,仅匹配自身,如"that",只能匹配"that";另一类就是具有特殊意义的元字符。不像基本字符,元字符具有特殊的含义,如.(句点)可以匹配任意除换行符外的单个字符。正则表达式就是学习各种元字符的使用。

Vim对正则表达式有很好的支持,它的常用元字符有:

通用匹配:

  • . -- 匹配任何除换行符外的单个字符
  • \s -- 匹配一个空白符(space或tab)
  • \S -- 一个非空白符
  • ^ -- 仅匹配行首,也即必须以模式开头
  • $ -- 仅匹配行尾,也即必须以模式结尾
  • \< -- 匹配词首,单词定义为一连串的字母,标点空白和数字均视为分隔符
  • \> -- 匹配词尾。
  • \<...\> -- 匹配整个单词(前面命令中的*和#就是用这个来只匹配单词)。当然\<和\>不必一起使用,可以分开使用

限量符:

  • * -- 前一个字符出现0次或多次,如a*,可以匹配'', 'a', 'aa'或'aaa'等
  • \+ -- 前一个字符出现1次或多次
  • \= -- 前一个字符出现0次或1次
  • \{n,m} -- 前一个字符出现n到m,如a\{3,5},则可以匹配'aaa', 'aaaa'或'aaaaa'
  • \{n} -- 前一个字符出现n次
  • \{n,} -- 前一个字符出现n次到最多次数(32000)
  • \{} -- 0次或多次,与*一致

操作符:

  • \| -- 或,如ab\|ba,则匹配'ab'或'ba'

其他:

  • [...] -- 字符集,表达一组字符的集合,匹配其中任何一个字符

    如[abc],则匹配a或b或c。连续的字符可以用-代替如,[a-c]则匹配a或b或c,[0-9]匹配0到9中任何一个数字,[a-zA-Z]匹配任何一个字母。通常与限量符一起使用,如:/[a-z]\{3,6},长度3到6的小写字串,/[0-9]\{2,4}长度2到4的数字。

  • ... -- 组合,把内部看成一个整体并保存起来以便后续引用。本身作用不大,要与其他元字符一起使用才能发挥其功效
  • \n -- 其中n=1~9,对组合的引用,也即引用...中所匹配的内容

    如,/that\1,则匹配thatthat;/[a−z].\1则匹配,aba, aoa, bcb等。

全局替换

替换也是编辑器中一个必不可少的功能,Vim对于替换也提供了强大的支持。

命令格式

:[range]s/pattern/replacement/[options]

把[range]所指的范围内的pattern替换为replacement

详解

  • range -- 可选。如果缺省就指当前行,也就是后面的命令仅对当前行有效

    指定方式:n,m -- 从第n行到第m行,包括第n行和第m行。其中.代表当前行; $代表最后一行; %表示全局,等同于1,$

  • options -- 可选,缺省时只替换一行中的第一个匹配

    常用:g -- 把一行中的所有匹配都替换;c -- 替换之前要求确认

示例:

  • :s/old/new -- 当前行中的第一个old替换为new
  • :s/old/new/g -- 当前行中的所有old替换为new
  • :s/old/new/gc -- 当前行中的所有old替换为new,每一个替换之前要求确认
  • :5,20s/old/new/gc -- 5到20行中的所有old替换为new,每一个替换之前要求确认
  • :.,20s/old/new/g -- 当前行到20行中的所有old替换为new
  • :.,$s/old/new/gc -- 当前行到最后一行中的所有old替换为new
  • :%s/old/new/gc -- 全局替换,文档中所有的old替换为new

根据条件替换

前面的替换方式是以行的方式指定具体的范围,也可以以另外一种方式指定范围:

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

全局查找pattern,对于匹配pattern的行进行后面的替换,这里的pattern和old都可以使用正则表达式,但是replacement是不能使用正则表达式的,对于replacement,它有自己专属的规则。

replacement中的规则

  • >\n n = 1~9 -- 引用pattern中的组合...。

    最常用的方式就是调换二个词的顺序或者用于重复输入,如:

    • :s/that, what/\2, \1 -- that, that被换成what, that
  • & -- 替换为模式的匹配,也即如果pattern匹配that,那么&就是that

    咋一听貌似这个没啥用处,如:s/that/&/gc,这与未替换之前是一样的。它也常用于重复输入,如:

    • :s/that/&,&,what/gc -- that替换成that, that, what
    • :s/.*/{&}/g -- 把当前行用{}括起来
  • ~ -- 替换为上一次替换命令所用的replacement,而pattern不必相同,也多用于重复编辑

    如:

    • :s/their/our/g -- their --> our
    • :s/his/~/g -- his --> our
    • :s/my/~/g -- my --> our
  • \u或\l -- 把接下来下一个字母转成大写或小写

    如::s/that/\uthat/g -- that --> That; :s/That\lThat/g -- That --> that。这多少显得有些弱智,直接拼大写或小写更方便。

    这二个多用于变量,如:

    • :s/what/\u\1/g -- what --> What;
    • :s/.∗/\u&/g 行首大写;
    • :s/[a−zA−Z]\+/\u&/g 每个单词都Captalization
  • \U或\L和\e或\E -- 把replacement中的从\U或\L到\e或\E的所有字母都转成大写或小写,如::s/restore/re\Usto\ere/ -- restore --> reSTOre,这也很弱智。

    还是与变量才更强大:

    • :s/restore/\U&/g -- restore --> RESTORE;
    • :s/ResTore/\L&/g -- ResTore --> restore

替换中的技巧

  • :s或:&或:~ -- 重复上次替换命令。可以加上选项g,:sg或:&g或:~g,则会对当前行所有匹配进行替换

    也可以加上范围% :%sg或:%&g或:%~g,则会对全文所有匹配都替换。

  • :s/pattern/replacement与:s/pattern/replacement一样
  • & -- 直接使用命令&与:&和:s和:~是一样的,即重复上一次替换
  • :和方向键,方向键也可以引用历史命令

Vim中的搜索和替换博大精深,要想掌握好唯有不断的练习与实践,这些讲的仅是一个开端。

参考文献:

《Learning.the.vi.and.Vim 7th edition》Chap 4, chap 6 and chap 10

Vim进阶技术:搜索和替换的更多相关文章

  1. 廖雪峰Java9正则表达式-2正则表达式进阶-6搜索和替换

    1.使用正则表达式分割字符串: String[] string.split(String regex); "a b c".split("\\s");->[ ...

  2. VIM 文件搜索与替换

    文件内搜索与替换 :[range]s/pattern/string/[c,e,g,i] 例如: :%s/oldword/newword/cg //对文本中全部匹配进行替换 :m,ns/oldword/ ...

  3. VIM中的正则表达式及替换命令

    VIM中的正则表达式及替换命令 一.使用正则表达式的命令 使用正则表达式的命令最常见的就是 / (搜索)命令.其格式如下: /正则表达式 另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正 ...

  4. Java都有什么进阶技术

    Java都有什么进阶技术?   看到有人给题主推荐<代码整洁之道>,评论有人说那不是JAVA进阶的书- 私以为,一些人对JAVA进阶的理解片面了,JAVA不过也是一门语言,提升和进阶还是内 ...

  5. vi的搜索和替换

    搜索中进行替换 /which #搜索which cwthat #替换成that n #重复搜索 . #重复替换 一种类型的替换命令 g/pattern/s/old/new/g 第一个 g 表示是有选择 ...

  6. 史上最全的Java高级技术点,全是Java高级进阶技术,几乎包含了Java后端的所有知识点

    史上最全的Java高级技术点,全是Java高级进阶技术,几乎包含了Java后端的所有知识点 1

  7. 【vim】搜索与替换

    1. 搜索 命令 功能 备注 * 向下搜索光标所在处的词 n下一个,N上一个 # 向上搜索光标所在处的词 同上 [+<Ctrl>+i 跳转到光标所在处的变量的声明 使用tag [+< ...

  8. Vim进阶命令

    1. 查找    /xxx(?xxx)       表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示                    向上查找.其中xxx可以是正规表达式, ...

  9. vim复制,粘贴,删除,撤销,替换,光标移动等用法

    我接触linux的时候,用的是nano这个文本编辑器,个人觉得他的最大优点就是方便,快速.打开文件,修改文件,到退出都十分的快速,简单.这一点上比vi,vim要强,但是nano不能显示彩色字,不能进行 ...

随机推荐

  1. [Node.js]31. Level 7: Redis coming for Node.js, Simple Redis Commands

    Let's start practicing using the redis key-value store from our node application. First require the  ...

  2. 2. Using 'dp' instead of 'px' to set text size

    android:textSize="45px"  ==> android:textSize="45dp" 因为Android Phone的手机分辨率各不相 ...

  3. js正则表达式/replace替换变量方法

    转自:http://www.blogjava.net/pingpang/archive/2012/08/12/385342.html 1. javascript 正则对象替换创建和用法:/patter ...

  4. BZOJ 1264 AHOI2006 基因匹配Match 动态规划+树状数组

    题目大意:给定n个数和两个长度为n*5的序列,每一个数恰好出现5次,求两个序列的LCS n<=20000.序列长度就是10W.朴素的O(n^2)一定会超时 所以我们考虑LCS的一些性质 LCS的 ...

  5. Android actionBar与Fragment结合使用Demo2

    上一篇文章介绍了ActionBar的使用,这里介绍ActionBar的还有一种用法.达到的效果和曾经的GroupActivity或TabHost是一样的,可作为导航来使用. 实现效果图: 源码: 布局 ...

  6. jQuery和CSS3超酷表单美化插件

     这是一款效果很精美炫酷的jQuery和CSS3联系方式表单美化插件.大多数站点上都有让用户填写的联系方式表单,一个设计良好的表单可以大大的提升用户的体验度.该表单美化插件在原生HTML表单的基础上进 ...

  7. JSTL标签引入(web基础学习笔记十八)

    一.JSTL包下载和引入 1.0.简介 JSTL全名为JavaServer Pages Standard Tag Library 1.1.下载包 下载地址:http://archive.apache. ...

  8. 从零开始学JavaScript三(变量)

    一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义变量时要使用var操作符 如: var message; ...

  9. rarlinux基于linux-x64

    winrar在Win都吃香,在也linux也凄惨...  风萧萧兮易水寒,壮士一去兮不复还! 00.下载rarlinux wget http://www.rarlab.com/rar/rarlinux ...

  10. VC 线程间通信的三种方式

    1.使用全局变量(窗体不适用)     实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和事件对象等来实现的.其中又以对全局变量的使用最为简洁.该方法将全局变量作为线程监视的对象,并通 ...