要搞清楚 vim中的正则和普通的Perl正则表达式的区别:
因为在perl中所有的元字符 都可以直接使用, 不需要在 元字符的前面加 反斜杠.

但是在vim, 包括grep中就有所区别, 同样是元字符, 有的就要在前面加上 反斜杠才行. 由于 vim和grep各自的关于正则的用法不尽相同, 所以 只能是 一个一个的记清楚,别的没有什么好办法了. 主要是记住不同的地方.

第一, 只说在vim中的正则: 参考: https://www.tuicool.com/articles/QzUBZr

  1. 首先 vim中的元字符 有 四种情形, 分别表示的是 四种作用:
  • 用来表示 单个 的 字符 的 元字符; (即 "字符"元字符, 注意的是, 每个字符元字符 表示的, 代表的总是 一个 字符 因为 你是一个元字符嘛, 所以你也只能代表一个字符, 要表示数量, 有专门的 "数量"元字符)
  • 用来表示 数量的 元字符; 即 "数量"元字符
  • 用来表示 位置的 元字符 , 即 "位置" 元字符
  • 用来表示 分组的 元字符 即 "分组" 元字符. (括号元字符)
  1. 在这些元字符中
  • 字符元字符包括: ., [abc] ,[^abc] , 以及专门符号表示的, 如:\d, \D, \w, \W, \x. \X, \s, \S (注意 如果要表示空格字符的话, 使用 \s)
    或者要表示空格, 使用\空格,这里, 空格必须转义 因为默认的, 空格表示 命令单词的 分割.
    如果要 表示 "字符元字符"本身的话, 要用 转义, 比如:\. \[ \* \\

  • 数量元字符中, 只有* 不用反斜杠, 其他的都要用 反斜杠, 包括:\+, \? \{m, n}, 注意, 大括号表示次数, 模糊匹配次数, 只需要在第一个大括号前加反斜杠, 当然在第二个大括号前加反斜杠也是可以的. 比如:/k\{2, 4}/ = /k\{2, 4\}

  • 位置元字符, 只有四个: ^, $, \<表示单词的开头 , \> 表示单词的结尾. 很清楚的: ^ 说的是 行首, 是匹配 **一行**的 开始 , 关心的是行! 而 \<才是句中的 单词 的词首. 一个是行首, 一个是词首. ...
    如果只是要匹配 1个 单词, 则使用 \w*因为当一个单词结束时, 必然会遇到空格或 其他标点符号.
    其中\<和 \> 是可以单独使用的, 单词的开头 是以 "空格" 和 标点符号为 标识的 . 所以: /r/ 和 /\<r/ 是不同的, 特别要注意, 既然是单词 的开头或结尾, 那么 这个单词就必须是以 \w, 或 [0-9a-zA-Z]开头的才行, 如果不是以这些开头的, 就不能算是开头!

  • 括号元字符, vim中的括号元字符 要用 反斜杠表示 : \( \) 而 前向 引用仍然用 \1, \2 等表示.

大多数的元字符在 替换字符串中, 都将失去意义, 表示普通字符, 只有极少数的几个元字符 仍有意义 比如&...

使用vim的正则表达式主要有 三种情况: 一是 搜索, 二是删除 : 使用/d命令, 三是 替换

在使用删除命令 的时候, 略有不同, 默认的是 只删除当前(向下查找)找到的第一个 对象. 如果要表示 整个文件 的 所有的范围的 , 要用 g(=global) 不能用 %(替换用的是%), 而且要放在 最前面, 即 : g/^$/d


第二, grep中的正则. 跟 vim中的正则, 除了 "扩展正则" 中的元字符不同外, 其他几乎完全一样, 比如 在数词 元字符的表示上, 大括号都要用 \{m, n \} (这里的 n后面的大括号一定要加\)

  1. 通常支持的是 "基本正则表达式", 如果要使用 "扩展正则表达式" , 可以有两种方法, 一是, 使用 -E选项, 二是 使用 专门的一个命令: egrep.
  2. 记住, 扩展的正则表达式, 只比 "基本正则"多4个 元字符: +, ? |, 括号 ()
    比如: 要过滤 bootps或 bootpc
    使用 cat /etc/services | grep -n 'bootps|bootpc' 会返回空, 而用 cat /etc/services | grep -nE 'bootps|bootpc' 则返回bootps和bootpc的行, 这是因为 | 只在 "扩展正则"中被支持

grep的用法上, 除了 要正确使用 单引号 括起来的正则表达式之外, 还要 熟悉它的 几个 常用的选项, 比如: -n, -E , -v(反选) -A, -B 等等.


最后记住的是, 正则表达式和 shell的 通配符不一样! shell的通配符通常只有*, ? [... ] 三个.

linux中的几乎所有的命令, 都会有 控制台的屏幕 输出 , 像 head, tail, grep等等 , 所以 凡是这些 控制台屏幕的 输出内容 , 几乎都可以将 它们 重定向到 文件中.

终于明白vim 和 grep 中 的正则表达式的用法, vim 正则表达式 和grep基本正则表达式 几乎一样的更多相关文章

  1. Linux下find一次查找多个指定类型文件,指定文件或者排除某类文件,在 GREP 中匹配多个关键 批量修改文件名等

    http://blog.sina.com.cn/s/blog_62e7fe670101dg9d.html linux下二进制文件查找: strings 0000.ts | grep -o " ...

  2. grep 中的正则表达式【转】

    正则表达式 正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列.下面是范例: ^w1 w1|w2 [^ ] grep 正则表达式示例 在 /etc/passswd 目录中搜索 'vivek ...

  3. 【在下版本,有何贵干?】Dockerfile中 RUN yum -y install vim失败Cannot prepare internal mirrorlist: No URLs in mirrorlist

    隐秘的版本问题---- Dockerfile中 RUN yum -y install vim失败Cannot prepare internal mirrorlist: No URLs in mirro ...

  4. 【日常小记】linux中强大且常用命令:find、grep【转】

    转自:http://www.cnblogs.com/skynet/archive/2010/12/25/1916873.html 在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍fin ...

  5. Linux 中强大且常用命令:find、grep

    在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下:    find命令        f ...

  6. grep中正则匹配的使用

    如要匹配Computer或computer两个单词,可做如下操作: [Cc]mputer “.”允许匹配ASCII集中任意字符,或为字母,或为数字. 使用\{\}匹配模式结果出现的次数 匹配字母A出现 ...

  7. 【转载】Linux中强大且常用命令:find、grep

    转载自:http://www.linuxeden.com/html/softuse/20130804/142065.html 在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find. ...

  8. linux中强大且常用命令:find、grep

    在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们. 本文结构如下: find命令 find命令的一般形 ...

  9. [转帖]「日常小记」linux中强大且常用命令:find、grep

    「日常小记」linux中强大且常用命令:find.grep https://zhuanlan.zhihu.com/p/74379265 在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍 ...

随机推荐

  1. 【Spring学习笔记-MVC】Spring MVC之多文件上传 (zhan)

    http://www.cnblogs.com/ssslinppp/p/4607330.html (zhan)

  2. python中impyla包报'TSocket' object has no attribute 'isOpen'错误

    经搜索得知,是thrift-sasl的版本太高了(0.3.0),故将thrift-sasl的版本降级到0.2.1 pip install thrift-sasl==0.2.1 经测试impyla 可以 ...

  3. smtp常见问题

    http://blog.csdn.net/chenfei_5201213/article/details/10138969

  4. 10.for

    要遍历一个范围(如数组或表),使用 for 循环.在数组上迭代时,当前数组元素存储在循环变量中.在遍历字典时, index 存储在循环变量中. (in 内容测试) for x in [5, 7, 11 ...

  5. html5-字体css

    #div1{font-size: 50px;}#div2{font-size: 50%;}#div3{font-size: 300%}#div4{font-size: 3em;}#div5{font- ...

  6. hdu5441 并查集+克鲁斯卡尔算法

    这题计算 一张图上 能走的 点对有多少个  对于每个限制边权 , 对每条边排序,对每个查询排序 然后边做克鲁斯卡尔算法 的时候变计算就好了 #include <iostream> #inc ...

  7. SpringMVC探究-----常用获取传递参数的方法

       1.@RequestParam @RequestParam 常用来映射请求参数,它有三个属性可以配置: value 值即请求参数的参数名 required 该参数是否必须. 默认为 true d ...

  8. codeforces 980B Marlin

    题意: 有一个城市有4行n列,n是奇数,有一个村庄在(1,1),村民的活动地点是(4,n): 有一个村庄在(4,1),村民的活动地点是(1,n): 现在要修建k个宾馆,不能修建在边界上,问能否给出一种 ...

  9. 20155228 2016-2017-2 《Java程序设计》第8周学习总结

    20155228 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 NIO与NIO2 NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区容量, ...

  10. SQL 中的连接查询

    关于SQL的应用,肯定离不开查询,而相对复杂的查询,总是离不开对表的连接,单个表操作的并不罕见,但是在应用环境大多数的查询都是针对2.3个表甚至更多的表7,至于连接,有内连接.外链接.交叉连接之分,每 ...