文本处理双剑客:sed 与 seq 完全指南
在 Linux 命令行世界里,有两个看似不起眼却极其强大的小工具:sed 和 seq。一个擅长对文本动刀 ,一个擅长生成数字序列。它们单独使用已经很有用,配合 Shell 循环一起上阵时,更是能解决大量批量处理问题。
本文将从基础到实战,系统梳理这两个命令的用法,并结合真实场景帮你彻底掌握它们。
摘要 :本文系统讲解 Linux 下两个高频文本处理工具------
sed与seq。sed是流编辑器,擅长按行号、正则地址对文本进行打印、删除、替换与插入;seq是数字序列生成器,支持指定首数、步长与尾数,并可等宽补零。文章从基本语法、核心操作命令、地址与范围讲起,结合删除历史记录、批量重命名、批量替换 IP、生成测试数据等实战案例,展示二者配合 Shell 循环解决批量重复任务的方法,并给出 macOS 兼容、正则模式、-i风险等注意事项。
一、sed:流编辑器之王
1. 什么是 sed?
sed(Stream Editor,流编辑器)是一个非交互式的文本编辑工具。它逐行读取输入(文件或管道),在内存的"模式空间"中对每一行进行处理,然后将结果输出。
核心特点:
- 不交互:所有编辑指令通过命令行参数或脚本传入
- 逐行处理:默认每次只读一行到内存,效率极高
- 默认不修改原文件 :输出到 stdout,除非显式指定
-i
2. 基本语法
bash
sed [选项] '地址/范围 操作' 文件
最常见的选项:
| 选项 | 作用 |
|---|---|
-i |
就地编辑(直接修改文件) |
-n |
静默模式,只输出被显式打印的行 |
-e |
指定多个编辑命令 |
-r / -E |
使用扩展正则表达式 |
3. 核心操作命令
| 命令 | 含义 | 示例 |
|---|---|---|
p |
打印 | sed -n '5p' file(打印第5行) |
d |
删除 | sed '10d' file(删除第10行) |
s/旧/新/ |
替换 | sed 's/foo/bar/' file(每行第一个 foo 换成 bar) |
s/旧/新/g |
全局替换 | sed 's/foo/bar/g' file(一行内全部替换) |
a\文本 |
追加 | sed '3a\hello' file(第3行后追加 hello) |
i\文本 |
插入 | sed '3i\hello' file(第3行前插入 hello) |
c\文本 |
替换整行 | sed '3c\new line' file(把第3行换成 new line) |
4. 地址与范围
sed 最强大的地方在于精确定位:
bash
sed '5d' file # 第5行
sed '2,6d' file # 第2到6行
sed '/pattern/d' file # 包含 pattern 的行
sed '/start/,/end/d' file # 从匹配 start 到匹配 end 之间的行
sed '$d' file # 最后一行($ 代表末尾)
sed '1~2d' file # 从第1行开始,每隔2行删一次(删奇数行)
5. 实战示例
场景 A:删除文件最后一行(回顾你的 history 清理)
bash
sed -i '$d' ~/.bash_history
$ → 最后一行,d → 删除,-i → 直接写回文件。
场景 B:只删除包含特定关键词的行
bash
sed -i '/history -w/d' ~/.bash_history
比 $d 更安全,精准匹配内容而不是位置。
场景 C:全局替换敏感词
bash
sed -i 's/my_secret_password/***REDACTED***/g' config.txt
场景 D:提取日志中某个时间段的内容
bash
sed -n '/2024-01-15 10:00/,/2024-01-15 11:00/p' app.log
6. 注意事项
- macOS vs Linux :macOS 的
sed -i必须带备份后缀参数,如sed -i '' 'cmd' file - 正则差异 :默认是基础正则(BRE),用
-r/-E开启扩展正则(ERE) -i很危险 :没有备份直接改文件,建议先不加-i预览结果,确认无误再加
二、seq:数字序列生成器
1. 什么是 seq?
seq(sequence)是一个极其简单的工具------它的唯一功能就是生成一串数字,然后打印出来。但它和 Shell 循环配合时,威力巨大。
2. 三种语法格式
bash
seq [选项]... 尾数 # 从 1 开始,步长为 1
seq [选项]... 首数 尾数 # 从首数开始,步长为 1
seq [选项]... 首数 步长 尾数 # 从首数开始,按指定步长递增/递减
3. 常用示例
bash
seq 5 # 1 2 3 4 5(每行一个)
seq 3 7 # 3 4 5 6 7
seq 1 2 10 # 1 3 5 7 9
seq 10 -1 6 # 10 9 8 7 6(倒序)
seq -s ',' 1 5 # 1,2,3,4,5(逗号分隔)
seq -w 8 11 # 08 09 10 11(等宽,补零)
4. seq 与 Bash 大括号展开
很多人会问:{1..10} 不也能生成序列吗?为什么要 seq?
| 特性 | seq |
{1..10} |
|---|---|---|
| 是否外部命令 | 是(/usr/bin/seq) |
否(Shell 内置) |
| 支持变量 | ✅ seq 1 $N |
❌ {1..$N} 不行 |
| 支持步长 | ✅ seq 1 2 10 |
✅ {1..10..2}(Bash 4+) |
| 支持倒序 | ✅ seq 10 -1 1 |
✅ {10..1} |
| 支持等宽补零 | ✅ -w |
❌ |
结论 :如果范围写死了,用 {1..10} 更快更简洁;如果范围里有变量 ,必须用 seq。
5. 在循环中的核心作用
seq 最常见的用法就是配合 for 循环控制执行次数:
bash
# 执行 10 次
for i in $(seq 1 10); do
echo "第 $i 次操作"
done
seq 负责"生成数字列表",for 负责"逐个取值并循环",各司其职。
三、双剑合璧:实战案例
案例 1:无痕批量删除 Bash 历史记录
这是你之前遇到的真实场景,完美展示了 seq + sed 的配合:
bash
# seq 生成行号序列,for 循环逐个删除内存中的记录
for i in $(seq 1 21); do
history -d 100
done
# sed 直接修改磁盘文件,彻底清除痕迹
sed -i '100,120d' ~/.bash_history
# 刷新内存
history -c && history -r
案例 2:批量重命名文件
bash
# 把 file1.txt ~ file20.txt 重命名为 doc1.txt ~ doc20.txt
for i in $(seq 1 20); do
mv "file${i}.txt" "doc${i}.txt"
done
案例 3:批量替换多个配置文件中的 IP
bash
# 假设有 10 台服务器的配置需要改
for i in $(seq 1 10); do
sed -i "s/192.168.1.${i}/10.0.0.${i}/g" "/etc/server${i}.conf"
done
案例 4:生成测试数据
bash
# 生成 100 行测试日志
for i in $(seq 1 100); do
echo "2024-01-$(seq -w $i $i | sed 's/^0//') INFO test log line $i"
done > test.log
四、总结
sed |
seq |
|
|---|---|---|
| 本质 | 流编辑器,对文本逐行加工 | 数字序列生成器 |
| 核心能力 | 查找、删除、替换、插入文本 | 生成有序数字列表 |
| 典型搭档 | 管道、正则、重定向 | for 循环 |
| 学习重点 | 地址定位 + 替换语法 | 三种参数形式 + 步长 |
| 常见坑 | -i 直接改文件无后悔药 |
大括号展开不支持变量 |
一句话概括:sed 负责"改",seq 负责"数",两者配合就能批量搞定大量重复性运维和文本处理任务。