13-5 vi查找和替换
七、查找和替换
vi 提供了在一行 或 整个文件中,根据搜索条件将光标移动至指定位置的功能。 vi 还可以执行文本替换工作,用户可指定替换时是否需要用户确认。
1.行内搜索(准)
(1)f命令
命令 f 在行内进行搜索,并将光标移至搜索到的下一个指定字符。 比如,命令 fa 就会将光标移动到本行下 1 处出现字符 a 的地方。 在执行过一次行内搜索之后,输入分号(:)可以使 vi 重复上次搜索。
2.搜索整个文件(准)
(1)/命令
同第 3 章讲过的 less 程序一样,命令 “ / ” 可以完成对单词或短语的搜索。
① 怎么做?
当用户使用 “ / ” 命令后,一个 “ / ” 符号会出现在屏幕的底部。 接下来,输入需要搜索的单词或短语以 Enter 结束,光标就会移动到下一处包含被搜索字符串的地方。
② n命令
使用 n 命令可以重复此搜索。
③ 示例
仍以foo.txt作为实验对象,将光标移至文件的第一行,并输入如下代码:
/Line
别忘了输入 Enter 以结束,光标将移动至第 2 行。 接下来,输入 n 命令,光标将继续移动至第 3 行。 重复输入 n 直至光标移动到文档的最后,且找不到符合条件的字符串。
④ 正则
尽管现在只讲解到 vi 的单词和词组的搜索模式,但是 vi 同样支持正则表达式(一种强大的表达复杂文本模式的方法)的应用。
3.全局搜索和替换
vi 使用 ex 命令来执行 几行之内 或 整个文件中的搜索和替换操作。 输入以下命令可将文件中的 Line替换为 line。
:%s/Line/line/g
下面就来解析这条命令每一部分的功能。(准)
组成 |
含义 |
---|---|
: |
分号用于启动一条 ex 命令。 |
% |
确定了操作作用的范围。%简洁地代表了从文件的第 1 行到最后 1 行。本命令的范围还可以表示为 1,5(因为本文件只有5行),也可表示为 1,$ (意思是:从第1行到文件的最后一行)。如果不明确指出命令的作用范围,那么命令只会在当前行生效。 |
s |
指定了具体的操作,本次是替换操作(搜索和替换) |
/Line/line |
搜索和替换的文本。 |
g |
代指 global(全局),也就是说对搜索到的每一行的每一个实例进行替换。如果 g 缺失,那么只替换每一行第 1 个符合条件的实例。 |
在命令末尾添加 c,则命令在每次替换之前都会请求用户确认。如下所示:
:%s/line/Line/gc
此命令将文件foo.txt中的 line 替换成 Line,也就是将文件替换回原来的样子,但是每次替换前,vi 都会停下来询问用户是否确认执行替换。
replace with Line(y/n/a/q/l/^E/^Y)?
圆括号中的每一个字符都是一种可能的回答,下表具体阐述了每一个字符的含义。
功能键 |
行为 |
---|---|
y |
执行替换。 |
n |
跳过此次替换。 |
a |
执行此次替换和之后的所有替换。 |
q 或 ESC |
停止替换。 |
l |
执行此次替换并退出替换。(是last的缩写) |
Ctrl-E,Ctrl-Y |
分别是向下滚动、向上滚动,能用于查看替换处的上下文。 |
- AngularJS driective 封装 自动滚动插件
- java类过滤器,防止页面SQL注入
- Web项目添加Maven支持
- Jquery 获取第一个子元素
- Dropwizard框架入门
- Java 解析Excel文件为JSON
- SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写
- CentOS 6.5 安装nginx 1.6.3
- C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
- MyBatis两张表字段名相同产生的问题
- mongo 3.0 备份和还原数据库 ,及too many positional arguments错误
- AngularJs HTTP响应拦截器实现登陆、权限校验
- C# 读写App.config配置文件的方法
- Golang语言社区--Go语言基础第四节类型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- DES ECB加解密的Java实现
- win10 uwp 不显示 SplashScreen 欢迎界面的方法
- WPF 在 XAML 写 C# 代码
- 解析 HashMap源码值概括
- 解析 HashMap 源码之基本操作
- Docker手册
- 小知识:TFA收集日志报错空间不足
- Java SPI 居然这么多知名框架在用
- Ceph 入门到实战之 RBD 块存储接口
- 聊聊 Python 面试最常被问到的几种设计模式(下)
- 带你用 Python 实现自动化群控(入门篇)
- 实战篇 | 基于freeRTOS的多任务事件传输demo(附代码)
- 在kali linux中你应该知道的信息收集姿势(一)
- 【拓展】谈谈字符编码:Unicode编码与emoji表情编码
- TCP/IP 应用层协议解释