场景
- 我们在远程连接服务器修改配置文件时, 有时候需要查找替换不正确的文本, 最慢的方式就是
vi 文件
, 之后移动方向键查找到某个关键字中, 接着按下i
进行删除和粘贴. 如果需要替换的文件多了, 则需要一个个文件打开并挨个替换, 容易出错还费时间, 有没有更好的办法?
说明
vi
-
准备工作:
vi
显示行号是:set nu
, 这样只是在本次编辑时显示, 如果要永久显示, 那么需要找到vimrc
配置文件并在一空行上加入set nu
, 在macOS
系统上, 路径是~/.vimrc
, 如果不存在, 那么使用vi ~/.vimrc
来直接新建一个配置文件. -
vi
有自己的查找替换命令, 也有大小写敏感的命令, 如果能利用vi
自带的命令替换文本, 无疑会快很多.
方式1: 第一次替换, 我们需要在某个文件里挨个查找文本,确认之后再逐个替换.
步骤1: 尾行模式下输入:set noic
:
:set ic # 忽略大小写敏感
:set noic # 大小写敏感
步骤2: 命令模式下输入:/要查找的文本
, 比如查找macOS
,:/macOS
, 找到一个后:s/macOS/Windows
, 把查找到第一个macOS
替换为Windows
. 这样逐步把所有匹配字符串替换完. 尾行模式下输入n
向前搜索, 大写N
向后搜索.
:s/macOS/Windows
方式2: 第二次替换, 确认第一次查找方式没错之后, 直接用替换全部到方式来一次过替换单个文件里的所有匹配字符串.
步骤1: 进入尾行模式
:%s/macOS/Windows/g
方式3: 替换当前行的所有敏感字符, 比如/
替换为//
, 这时候就需要\
来转义.
:s/\/\//\//g
注意: 如果当前步骤替换错了, 可以在命令模式下按u
, 撤销上一步操作.
sed
vi
的替换已经够快了, 有没有更快的方式, 比如不需要打开文本, 直接指定文本路径替换, 那就更快了. 有的, 使用sed
命令. 这个操作会直接修改sign-code.sh
文件, 修改之前会生成一份原有文件的备份为sign-code.she
, 这样就不怕改错啦.
sed -ie "s/old string/new string/g" sign-code.sh
参考
vi 的文本替换
macOS 与 Linux 下 Vim 配置文件
Linux之vi三种模式常用操作的学习
Vim查找忽略大小写