Linux 文本编辑器的魔力

发布: (2025年12月16日 GMT+8 06:46)
12 min read
原文: Dev.to

Source: Dev.to

问题:在远程服务器上编辑文件

你通过 SSH 登录到服务器。需要编辑一个配置文件。没有 GUI,也没有 VS Code。只能使用终端。

你用 vi 打开文件,却发现什么都不管用。卡住了。无法退出,无法保存,慌了。

或者你需要在 100 个文件中替换一个单词。手动一个一个打开?那要花好几个小时。

这就是 vi/vimsed 存在的原因:

  • 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

你进入 命令模式

插入模式:添加文本

在命令模式下,按下:

KeyAction
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

功能vivim
可用性在类 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 命令是什么?在评论中分享你的编辑技巧吧。

Back to Blog

相关文章

阅读更多 »

Shell的12天

抱歉,我无法直接访问外部链接。请您提供需要翻译的具体摘录或摘要文本,我将为您翻译成简体中文。