Skip to content

Latest commit

 

History

History
227 lines (177 loc) · 5.73 KB

54-81622-匹配替换.sy.md

File metadata and controls

227 lines (177 loc) · 5.73 KB
show version enable_checker
step
1.0
true

查找细节

回忆上节课内容🤔

  • 我们学习了
    • 替换 substitude
  • 替换单行
    • :s/shiyanlou/oeasy
  • 加上range
    • :3,5s/shiyanlou/oeasy
    • :%s/shiyanlou/oeasy
  • 加上flag
    • :3,5s/shiyanlou/oeasy/g 多个替换
    • :3,5s/shiyanlou/oeasy/gc 多个替换且逐个确认
  • 替换还是很方便的
  • 但是我想替换中使用正则表达式
  • 可以么?🤔
  • 先回忆一下正则表达式模式匹配

模式 - 列举字符

  • [abcd]
    • 表示匹配方括号中列举的
    • 任意一个 字符
    • abcd 中的任意一个字符
  • [a-z]
    • 可用 `中划线-`` 表示字符范围来减少列举的
    • [a-d] 等价于 [abcd]
  • [^abcd]
    • 表示匹配除方括号中字符以外的任意字符
    • 除了 abcd 之外的任意字符

模式 - 常用符号

  • .
    • 等价于 [^\n]
    • 除了换行符( \n )以外,表示匹配任意一个字符
  • \l
    • 等价于 [a-z]
    • 表示匹配 任意一个小写字母
    • 意思是lowercase
  • \L
    • 等价于 [^a-z]
    • 表示匹配 任意一个除小写字母外的其他字符
  • \u
    • 等价于 [A-Z]
    • 表示匹配 任意一个大写字母
    • 意思是uppercase
  • \U
    • 等价于 [^A-Z]
    • 表示匹配 任意一个除大写字母外的其他字符
  • \w
    • 等价于 [0-9A-Za-z_]
    • 表示匹配 任意一个字母、数字、下划线
  • \W
    • 等价于 [^0-9A-Za-z_]
    • 表示匹配 任意一个字符除了字母、数字、下划线。
  • \d
    • 等价于 [0-9]
    • 表示匹配 任意一个数字
  • \D
    • 等价于 [^0-9]
    • 表示匹配 任意一个除数字外的其他字符
  • \x
    • 等价于 [0-9A-Fa-f]
    • 表示匹配 任意一个十六进制数字
  • \X
    • 等价于 [^0-9A-Fa-f]
    • 表示匹配 任意一个除十六进制数字外的其他字符
  • \s
    • 包括两种分隔符
    • 空格tab

帮助手册

图片描述

起止标记

  • 然后我们明确一下起止标记

    • ^ 表示匹配 输入字符串的开始位置 (行首)。
    • $ 表示匹配 输入字符串的结束位置 (行尾)。 -\< 表示匹配 单词词首。
    • \> 表示匹配 单词词尾。

对应单词

  • :%s/four/4/g
    • 把所有的four替换为4
  • 但是同时fourtyfourteen 都匹配了
    • 我们可以明确four必须是一个独立单词
    • 需要:%s/\<four\>/4/g
  • 但是同时twenty-four
    • 还是被替换为twenty-4
  • 如果只想精准匹配four
    • 前后可以加^$明确开头和结尾。
    • :%s/^four$/4/g匹配独立的four这个单词
    • 这样替换就可以了

图片描述

单词匹配

  • 如果我们要替换所有的以a开头d结尾的单词
    • 并允许在词中进行替换oeasy
    • :%s/\<a.*d\>/oeasy/g
  • addand 被替换
  • band 不被替换

图片描述

具体案例

图片描述

  • 我要完成如下这么一个替换
  • 应该怎么做呢
  • 🤔

先查找

图片描述

图片描述

图片描述

  • 确定查找模式最终为\d\{1,2}.

替换

图片描述

  • 把查找到的匹配字符串替换为换行
  • 如果我们想要删除空行
  • 应该怎么办?

删除空行

  • 首先我们找到空行 /^$
  • 从开头 ^ 到结尾 $ 中间没东西
  • 找到了以后,我们来替换
    • %s/^$//这并不能删除行
    • 执行了之后空行还是存在
  • 我们可以使用g命令
    • :g/^$/d
  • 如果开头结尾之间有空格怎么办?
    • /^\s*$ 先找到匹配
    • \s表示空格和tab
    • *表示0-任意多个空格或者tab

图片描述

  • 下面这个命令将这些空格和tab组成的行删除
    • :%g/^\s*$/d
  • 那能否把空格分割的文本分行

分行

图片描述

  • :%s/\s\+/\r/g
    • %表示所有行
    • s替换subtitute
    • \s 空格和tab
    • \+ 一个或一个以上
    • \r 换行
    • g 全局 global

图片描述

头尾trim

  • 如果我们想把头或者尾的空格和tab去掉
    • 应该怎么办呢?
  • 头部的空格或tab
    • ^\s*
  • 尾部的空格或tab
    • \s*$
  • 头部或尾部的空格或tab
    • ^\s*\|\s*$
  • 把头部或尾部的空格或tab替换为空
    • :%s/^\s*\|\s*$//g

图片描述

图片描述

转义字符

  • 如果我们要删除所有//开头的行
    • 这个/需要转义
    • 先搜索/^//.*$
  • :%s/^\/\/.*$//g
    • 删除了注释内容
    • 但是空行还在
  • :g/^\/\/.*$/d
    • 删除了空行
    • 但是开头有空格和tab的无法删除
  • :g/^\s*\/\/.*$/d
    • \\ 前面有空格和tab的也删除了

总结

  • 进行了模式匹配批量替换的的操作
  • 替换单词
    • :%s/\<a.*d\>/oeasy/g
  • 转义字符
    • %s/^\/\/.*$/d
  • 删除空行
    • :g/^\s*$//d
  • 删除注释行
    • :g/^\s*\/\/.*$/d
  • 替换还有一些什么玩法吗?🤔
  • 下次再说 👋