Linux 文本处理三剑客(二):sed 完全指南

引言

上一篇我们学习了 awk------按列处理文本的利器。今天要讲的 sed (Stream Editor,流编辑器)则是按行处理文本的专家。它不需要打开文件,直接对流中的每一行执行编辑操作:替换、删除、插入、追加......特别适合批量修改配置文件和脚本化文本处理。

sed 和 awk 经常配合使用,一个负责按行过滤编辑,一个负责按列计算统计。

第一部分:基础语法

一、命令格式

bash 复制代码
sed '地址 命令' 文件名
  • 地址:决定哪些行需要处理(行号、正则、范围),可省略

  • 命令 :对匹配的行执行什么操作(s 替换、d 删除、i 插入等)

二、创建测试文件

bash 复制代码
cat > test.txt << EOF
第1行:hello world
第2行:hello linux
第3行:hello sed
第4行:goodbye world
第5行:hello again
EOF

三、最常用命令速览

命令 作用 示例
s 替换 s/old/new/
d 删除行 2d 删除第2行
p 打印行 2p 打印第2行
i 在行前插入 2i\新内容
a 在行后追加 2a\新内容
c 替换整行 2c\新内容

第二部分:替换操作(最常用)

一、基本替换

bash 复制代码
# 语法:s/旧内容/新内容/
# 默认只替换每行第一个匹配

sed 's/hello/hi/' test.txt

输出

二、全局替换

bash 复制代码
# g = global,替换每行所有匹配

sed 's/hello/hi/g' test.txt

三、指定行替换

bash 复制代码
# 只替换第 2 行
sed '2s/hello/hi/' test.txt

# 替换第 2 到第 4 行
sed '2,4s/hello/hi/' test.txt

# 替换最后一行
sed '$s/hello/hi/' test.txt
地址写法 含义
2 只处理第 2 行
2,4 处理第 2 到第 4 行
$ 处理最后一行
2,$ 处理第 2 行到最后
/正则/ 匹配正则的行
省略 处理所有行

四、使用不同分隔符

当内容本身包含 / 时(如路径),可以换其他分隔符:

bash 复制代码
# 把 /usr/bin 替换成 /usr/local/bin
# 用 | 或 # 做分隔符,避免和 / 冲突

sed 's|/usr/bin|/usr/local/bin|g' file
sed 's#/usr/bin#/usr/local/bin#g' file

五、原地修改文件

bash 复制代码
# -i 参数:直接修改原文件(而不是输出到屏幕)

sed -i 's/hello/hi/g' test.txt

# 备份原文件(加后缀)
sed -i.bak 's/hello/hi/g' test.txt
# 修改 test.txt,原文件备份为 test.txt.bak

第三部分:删除操作

bash 复制代码
# 删除第 3 行
sed '3d' test.txt

# 删除第 2 到第 4 行
sed '2,4d' test.txt

# 删除最后一行
sed '$d' test.txt

# 删除包含 "hello" 的行
sed '/hello/d' test.txt

# 删除空行
sed '/^$/d' test.txt

# 删除以 # 开头的注释行
sed '/^#/d' config.conf

# 删除第 2 行到包含 "world" 的行
sed '2,/world/d' test.txt

第四部分:插入、追加、替换整行

bash 复制代码
# i = insert(在目标行之前插入)
sed '2i\这是新插入的行' test.txt

# a = append(在目标行之后追加)
sed '2a\这是新追加的行' test.txt

# c = change(替换整行)
sed '2c\这是替换后的新行' test.txt

第五部分:多个命令组合

bash 复制代码
# 用 -e 执行多个命令
sed -e 's/hello/hi/' -e 's/world/universe/' test.txt

# 用分号分隔(等效写法)
sed 's/hello/hi/; s/world/universe/' test.txt

# 对同一地址执行多个命令(用 {} 包裹)
sed '2{s/hello/hi/; s/linux/unix/}' test.txt

第六部分:正则表达式

一、匹配包含某内容的行

bash 复制代码
# 打印包含 "hello" 的行
sed -n '/hello/p' test.txt

# 删除以 "第" 开头的行
sed '/^第/d' test.txt

# 删除以 "world" 结尾的行
sed '/world$/d' test.txt

-n 参数 :安静模式,不自动打印每行,只打印 p 命令指定的行。

二、替换中的正则

bash 复制代码
# & 表示匹配到的原内容
echo "hello world" | sed 's/hello/[&]/'
# [hello] world

# \1, \2 引用分组
echo "hello world" | sed 's/\(hello\) \(world\)/\2 \1/'
# world hello

# 删除行尾空格
sed 's/ *$//' file

# 多个连续空格压缩为一个
sed 's/  */ /g' file
正则写法 含义
^ 行首
$ 行尾
. 匹配任意单个字符
* 前一个字符出现 0 次或多次
\+ 前一个字符出现 1 次或多次
\( \) 分组(用于 \1 \2 引用)
[abc] 匹配 a、b 或 c
[^abc] 不匹配 a、b、c

第七部分:实战场景

一、批量修改配置文件

bash 复制代码
# 修改 SSH 端口
sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config

# 取消注释某行
sed -i 's/^#\(.*enable\)/\1/' config.conf

# 给某行添加注释
sed -i 's/^\(.*debug.*\)/#\1/' config.conf

二、提取日志特定内容

bash 复制代码
# 提取某时间段的日志
sed -n '/2024-01-01 10:00/,/2024-01-01 11:00/p' app.log

# 删除日志中的空白行和注释行
sed -e '/^$/d' -e '/^#/d' config.conf

三、文本格式化

bash 复制代码
# 给每行加行号
sed '=' test.txt | sed 'N; s/\n/ /'

# 每行前面加 4 个空格(缩进)
sed 's/^/    /' test.txt

# Windows 换行符转 Linux
sed -i 's/\r$//' file.txt

四、配合管道使用

bash 复制代码
# 结合 grep 和 sed
ps aux | grep nginx | sed 's/  */ /g'

# 结合 find 批量修改
find . -name "*.txt" -exec sed -i 's/old/new/g' {} \;

第八部分:sed 命令速查表

命令 作用 示例
s/old/new/ 替换(只替换每行第一个) sed 's/a/b/' file
s/old/new/g 全局替换 sed 's/a/b/g' file
s/old/new/2 替换每行第 2 个匹配 sed 's/a/b/2' file
nd 删除第 n 行 sed '2d' file
ni\text 在第 n 行前插入 sed '2i\hello' file
na\text 在第 n 行后追加 sed '2a\hello' file
nc\text 替换第 n 行整行 sed '2c\hello' file
-n '2p' 只打印第 2 行 sed -n '2p' file
-i 原地修改文件 sed -i 's/a/b/' file
-i.bak 原地修改+备份 sed -i.bak 's/a/b/' file

总结

一、sed 的核心操作

sed = 地址 + 命令

地址:行号 / 正则 / 行号范围

命令:s(替换) d(删除) i(插入) a(追加) c(改行) p(打印)

最常用:sed 's/旧/新/g' file

二、awk vs sed

对比项 sed awk
处理方式 按行编辑 按列分析
最擅长 替换、删除、插入行 按列计算统计
典型用法 sed 's/old/new/g' awk '{print $2}'
变量支持 强(NR, NF, 自定义变量)
搭配使用 sed 预处理 → awk 分析统计

三、一句话记忆

sed 逐行处理文本流,用 s/old/new/g 做替换、d 做删除、i/a/c 做插入追加改行,支持正则匹配和地址范围,配合 -i 可原地修改文件。

相关推荐
莫名的好感°1 天前
手机RAR解压怎么选?2026年二季度四款产品问答
服务器·网络·智能手机
qq_163135751 天前
Linux 【04-more命令超详细教程】
linux
sevencheng7981 天前
【ADB】adb命令行常用按键模拟代码
linux·adb·模拟按键,返回键,音量键
暗影天帝1 天前
BPI-R3 Mini 刷 Yuzhii DHCPD U-Boot 教程
linux
小赖同学啊1 天前
智能连接器集群化高可用生产方案
linux·运维·人工智能
wanghao6664551 天前
DevOps 从入门到实践:构建高效交付流水线
运维·devops
qq_546937271 天前
从“能用”到“超神”,DeepSeek++给网页版装上“大脑”和“手脚”,支持长期记忆、MCP工具与自动化任务!
运维·自动化
ZStack开发者社区1 天前
基于AI Agent的ZCF API文档全链路自动化
运维·人工智能·自动化
Cinema KI1 天前
Linux第一个系统程序-进度条
linux·服务器
Moshow郑锴1 天前
Ubuntu 26.04 更换阿里云源镜像
linux·运维·ubuntu