Linux 文本编辑器的魔力
Source: Dev.to
问题:在远程服务器上编辑文件
你通过 SSH 登录到服务器。需要编辑一个配置文件。没有 GUI,也没有 VS Code。只能使用终端。
你用 vi 打开文件,却发现什么都不管用。卡住了。无法退出,无法保存,慌了。
或者你需要在 100 个文件中替换一个单词。手动一个一个打开?那要花好几个小时。
这就是 vi/vim 和 sed 存在的原因:
- vi/vim – 交互式编辑。
- sed – 自动化文本转换。
理解 vi/vim
vi(visual editor)在每个 Linux 系统上都有。vim(vi improved)是功能更丰富的增强版。
两种模式:关键概念
| 模式 | 描述 |
|---|---|
| 命令模式(默认) | 导航、删除、复制、搜索 |
| 插入模式 | 正常输入文本 |
启动 vi/vim
vi filename # Opens file in vi
vim filename # Opens file in vim
你进入 命令模式。
插入模式:添加文本
在命令模式下,按下:
| Key | Action |
|---|---|
i | 在光标位置插入 |
a | 在光标后插入(会添加一个空格) |
o | 在 下方 打开新行并进入插入模式 |
O | 在 上方 打开新行并进入插入模式(大写 O) |
按 ESC 返回到命令模式。
命令模式:导航与编辑
基本移动
h # Left
j # Down
k # Up
l # Right
(或使用方向键。)
删除
x # Delete character under cursor
dd # Delete entire line
dw # Delete word
D # Delete from cursor to end of line
撤销 / 重做
u # Undo last change
Ctrl+r # Redo
替换
r # Replace single character (type new char)
R # Replace mode – keep typing to replace multiple characters
注意: r 在替换多个字符时不可靠。请使用 R 或搜索/替换命令。
搜索
/keyword # Search forward
?keyword # Search backward
n # Next occurrence
N # Previous occurrence
复制与粘贴(Yank / Put)
yy # Yank (copy) current line
p # Put (paste) below cursor
P # Put above cursor (capital P)
3yy # Yank 3 lines
保存与退出
:w # Write (save)
:q # Quit (only if no changes)
:wq # Write and quit
:wq! # Force write and quit
:q! # Quit without saving (discard changes)
Shift+ZZ # Same as :wq
重要提示: 这些命令只能在命令模式下使用(先按 ESC)。
在 vim 中搜索和替换
在命令模式下:
:%s/old/new/g " Replace all occurrences in the file
:%s/old/new/gc " Replace all, with confirmation
:s/old/new/g " Replace in the current line only
:%s/old/new/g 的拆解:
:– 进入命令行模式。%– 对整个文件生效。s– 替换(substitute)。/old/new/– 将 “old” 替换为 “new”。g– 全局(每行的所有匹配)。
在特定行上替换
:1,10s/old/new/g " Lines 1‑10
:5s/old/new/g " Line 5 only
示例:更改变量名
# Replace "userName" with "userId" everywhere
:%s/userName/userId/g
vi 与 vim
| 功能 | vi | vim |
|---|---|---|
| 可用性 | 在类 Unix 系统上始终可用 | 可能需要安装 |
| 语法高亮 | 否 | 是 |
| 多级撤销 | 有限 | 是 |
| 窗口分割 | 否 | 是 |
| 插件 | 否 | 是 |
| 增强的搜索/替换 | 基础 | 高级 |
查看 openvim.com 获取交互式 vim 教程。
安装 vim(如果尚未安装)
# Ubuntu/Debian
sudo apt install vim
# CentOS/RHEL
sudo yum install vim
Source: …
sed 命令:流编辑器
sed(流编辑器)以 非交互式 方式转换文本。非常适合脚本和批量操作。
基本语法
sed 'command' filename
查找并替换
# 替换每行的第一次出现
sed 's/Name/NewName/' filename
# 替换所有出现(全局)
sed 's/Name/NewName/g' filename
# 替换并直接保存到文件(就地)
sed -i 's/Name/NewName/g' filename
重要提示:
- 不加
-i时,输出会发送到 stdout(原文件保持不变)。 - 加上
-i时,文件会被直接修改。 /g标志使替换在每行上全局进行。
删除文本
# 删除特定单词
sed 's/Name//g' filename
# 删除包含关键字的行
sed '/keyword/d' filename
# 删除空行
sed '/^$/d' filename
# 删除前两行
sed '1,2d' filename
# 删除第 5‑10 行
sed '5,10d' filename
替换特殊字符
# 将制表符替换为空格
sed -i 's/\t/ /g' filename
# 将空格替换为制表符
sed -i 's/ /\t/g' filename
TL;DR
- vi/vim – 用于交互式编辑、快速修复,以及学习强大的键盘驱动工作流。
- sed – 用于单行命令、脚本以及对大量文件进行批量文本转换。
精通两者,你就能像专业人士一样编辑远程 Linux 系统。
屏幕模式
退出全屏模式
Source: …
显示特定行
# 显示第 12‑18 行
sed -n '12,18p' filename
# 显示除第 12‑18 行之外的所有行
sed '12,18d' filename
# 显示前 10 行(类似 head)
sed -n '1,10p' filename
添加空行
# Add a blank line after each line
sed G filename
# Double‑space the file (output to a new file)
sed G filename > newfile.txt
高级替换:跳过行
# 在除第 1 行之外的所有行中替换
sed '1!s/word/newword/g' filename
# 仅在第 10‑20 行中替换
sed '10,20s/word/newword/g' filename
实际场景
场景 1:更新配置
# Check current value
grep "port" /etc/app/config.yml
# Replace with sed
sed -i 's/port: 8080/port: 3000/g' /etc/app/config.yml
# Verify change
grep "port" /etc/app/config.yml
场景 2:清理日志文件
# Remove empty lines
sed -i '/^$/d' app.log
# Remove DEBUG lines
sed -i '/DEBUG/d' app.log
# Or chain them
sed -i '/^$/d; /DEBUG/d' app.log
场景 3:批量文件更新
# Find all .js files and replace
find . -name "*.js" -exec sed -i 's/api.old.com/api.new.com/g' {} \;
场景 4:在服务器上编辑配置
ssh user@server
sudo vim /etc/nginx/nginx.conf
# Press i to enter insert mode
# Make changes
# Press ESC
# Type :wq to save and exit
场景 5:删除注释
sed -i '/^#/d' script.sh
结合 vi/vim 与 sed
- 使用 vi/vim 进行交互式编辑。
- 使用 sed 进行自动化、批量修改。
何时使用 vim
- 编辑单个文件
- 需要在编辑时查看上下文
- 进行多项、不同的修改
- 交互式工作
何时使用 sed
- 批量处理多个文件
- 脚本化的修改
- 简单的查找/替换操作
- 自动化部署
示例工作流
# 1. 检查需要更改的内容
grep "old_value" *.conf
# 2. 测试 sed 命令(不加 -i)
sed 's/old_value/new_value/g' config.conf
# 3. 应用于所有文件
sed -i 's/old_value/new_value/g' *.conf
# 4. 如有需要,在 vim 中验证单个文件
vim config.conf
Source:
快速参考
vim 命令
| 命令 | 操作 |
|---|---|
i | 在光标处进入插入模式 |
a | 在光标后插入 |
o | 在下方打开新行 |
ESC | 返回命令模式 |
x | 删除字符 |
dd | 删除整行 |
u | 撤销 |
r | 替换字符 |
/keyword | 搜索 |
yy | 复制(yank)整行 |
p | 粘贴 |
:w | 保存 |
:q | 退出 |
:wq | 保存并退出 |
:q! | 不保存直接退出 |
Shift+ZZ | 保存并退出 |
:%s/old/new/g | 替换所有出现的内容 |
sed 命令
| 命令 | 操作 |
|---|---|
sed 's/old/new/g' file | 替换所有出现的内容 |
sed -i 's/old/new/g' file | 原地替换 |
sed '/keyword/d' file | 删除包含 keyword 的行 |
sed '/^$/d' file | 删除空行 |
sed '1,5d' file | 删除第 1‑5 行 |
sed -n '10,20p' file | 显示第 10‑20 行 |
sed 's/\t/ /g' file | 将制表符转换为空格 |
sed G file | 双行间距(在每行后添加空行) |
常见错误
错误 #1 – 忘记退出插入模式
你在输入命令,但它们显示为文本。先按 ESC。
错误 #2 – 使用 sed 前未进行测试
# 错误 – 立即修改文件
sed -i 's/old/new/g' important_file.txt
# 正确 – 先测试
sed 's/old/new/g' important_file.txt # 检查输出
# 如果结果满意,再加 -i
错误 #3 – 未对特殊字符进行转义
# 错误
sed 's/http://old.com/http://new.com/g' file
# 正确 – 转义斜杠或使用其他分隔符
sed 's|http://old.com|http://new.com|g' file
错误 #4 – 忘记使用 /g 标志
# 只替换每行的第一次出现
sed 's/old/new/' file
# 替换所有出现的地方
sed 's/old/new/g' file
提高效率的技巧
技巧 1 – 在 sed -i 之前创建备份
# Create a .bak backup
sed -i.bak 's/old/new/g' file.txt
技巧 2 – 学习使用 vim,自动化使用 sed
Learn editing interactively in vim; once you know the pattern, automate with sed.
技巧 3 – 链式 sed 命令
# Multiple operations at once
sed -i '/^$/d; /DEBUG/d; s/old/new/g' file.txt
技巧 4 – Vim 行号
:set number " Show line numbers
:set nonumber " Hide line numbers
实用示例
示例 1 – 更新数据库连接
# Old: localhost
# New: db.server.com
sed -i 's/localhost/db.server.com/g' config.php
示例 2 – 更改所有端口
# Update port 8080 to 3000 in all *.conf files
find /etc/app -name "*.conf" -exec sed -i 's/:8080/:3000/g' {} \;
示例 3 – 删除行尾空白
sed -i 's/[[:space:]]*$//' file.txt
示例 4 – 在行首添加文本
# Prefix each line with "# "
sed -i 's/^/# /' file.txt
注释一行
sed 's/^/# /' file.txt
示例 5:在特定部分进行替换
# Replace only in lines 10‑50
sed '10,50s/old/new/g' file.txt
关键要点
- Vim 有两种模式 – 命令模式(默认)和插入模式 (
i)。 ESC返回命令模式 – 永远记住这一点。:wq保存并退出 – 或使用Shift+ZZ。sed用于自动化 – 使用-i直接修改文件。- 先在不加
-i的情况下测试sed– 在应用之前预览更改。 - 使用
/g进行全局替换 – 不加/g只会替换行中第一次出现的内容。 - Vim 用于交互式编辑,
sed用于批处理 – 为任务选择合适的工具。 - 在 openvim.com 上练习 – 交互式 Vim 教程。
Vim 和 sed 并非过时的工具;它们是服务器管理、自动化和高效文本编辑的必备利器。掌握它们,你就能比任何点击 GUI 的人更快地编辑文件。
你最常用的 Vim 或 sed 命令是什么?在评论中分享你的编辑技巧吧。