Linux 文本处理神器:sed 命令从入门到实战全指南

在 Linux 系统管理和日常运维中,文本处理是高频需求——无论是修改配置文件、筛选日志内容,还是批量编辑数据,都离不开高效的工具。而 sed(Stream Editor,流编辑器) 作为其中的“元老级”工具,凭借其强大的脚本化编辑能力,成为处理文本的“瑞士军刀”。本文将从原理、基础用法到生产实战,带你彻底掌握 sed 命令。

一、认识 sed:它是什么,如何工作?

1. sed 核心定位

sed 是一款基于脚本的流编辑器,主要用于:

  • 自动编辑单个或多个文本文件;
  • 简化重复的文本处理操作(如批量替换配置项);
  • 编写文本转换程序(如日志格式标准化)。

它最大的特点是“逐行处理”——无需打开文件,即可通过指令对文本流进行高效操作。

2. 必须理解的工作原理

sed 的工作流程围绕 “模式空间”(临时缓冲区)展开,核心分为三步:读取 → 执行 → 显示,具体逻辑如下:

  1. 读取:从输入流(文件、管道、标准输入)中逐行读取内容,存入“模式空间”(清空原有数据);
  2. 执行:按预设指令顺序处理模式空间的内容。若指定了行地址(如“3-5行”“包含the的行”),仅对匹配行执行指令;未指定则对所有行执行;
  3. 显示:将处理后的内容输出到屏幕(默认),随后清空模式空间;
  4. 循环:重复上述步骤,直到所有行处理完毕。

⚠️ 关键注意点:默认情况下,sed 仅操作“模式空间”的临时数据,不会修改源文件!若需修改源文件,需用 -i 选项(直接编辑)或重定向(>,输出到新文件)。

二、sed 命令基础:格式、选项与动作

1. 两种核心命令格式

sed 的用法分为“直接指令”和“脚本文件”两种,按需选择:

  • 直接指定指令(简单场景):
    sed [选项] '操作' 文件名
    例:sed -n '3p' demo(显示 demo 文件第3行)
  • 调用脚本文件(复杂场景):
    sed [选项] -f 脚本文件 文件名
    例:sed -f edit.sed demo(执行 edit.sed 中的指令处理 demo)

2. 常用选项(新手必记)

选项用于控制 sed 的执行方式,以下是高频选项的功能说明:

选项 核心功能 实用场景
-n 取消默认输出,仅显示处理后的结果 配合 p(打印)动作,避免重复输出
-i 直接编辑源文件(危险!建议加备份) 批量修改配置文件,如 -i.bak 会生成原文件备份(file.bak
-r 启用扩展正则表达式 无需对 +?() 等元字符转义,简化正则编写
-e 执行多个编辑指令 一次执行多步操作,如 -e 's/a/A/' -e 's/b/B/'
-f 读取脚本文件中的指令 指令较多时,用脚本文件管理(如10+条操作)

3. 核心动作指令(实现文本操作)

“动作”是 sed 的“灵魂”,用于指定对文本的具体操作,格式为 [行地址]动作(行地址可选)。以下是最常用的动作:

动作 功能描述 示例
p 打印匹配行内容 3p(打印第3行)、/the/p(打印包含the的行)
d 删除匹配行 3,5d(删除第3-5行)、/^$/d(删除空行)
s 字符串替换,格式 s/旧值/新值/选项 s/the/THE/g(全局替换the为THE)、s/o//g(删除所有o)
a 在匹配行下方插入内容 3aNew Line(第3行后插“New Line”)
i 在匹配行上方插入内容 /the/iPrefix(包含the的行前插“Prefix”)
c 用指定内容替换整行 5cHello(第5行替换为“Hello”)

三、sed 实战:从基础到进阶场景

以下示例均以 demo 文件为操作对象,覆盖日常工作中最常用的文本处理需求。

1. 筛选输出文本(p 动作 + -n 选项)

核心需求:精准显示目标行,避免默认全量输出。

# 1. 显示第3行
sed -n '3p' demo

# 2. 显示第3-5行
sed -n '3,5p' demo

# 3. 显示所有奇数行(n 表示“读取下一行”,跳过偶数行)
sed -n 'p;n' demo

# 4. 显示包含“the”的行
sed -n '/the/p' demo

# 5. 显示以“PI”开头的行(^ 匹配行首)
sed -n '/^PI/p' demo

# 6. 显示以数字结尾的行($ 匹配行尾)
sed -n '/[0-9]$/p' demo

# 🌟 实际场景:提取 ifconfig ens33 的IP地址(结合正则)
ifconfig ens33 | sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'

2. 删除文本行(d 动作)

核心需求:删除不需要的行(如空行、注释行、特定内容行)。

# 1. 删除第3行
sed '3d' demo

# 2. 删除第3-5行
sed '3,5d' demo

# 3. 删除包含“cross”的行
sed '/cross/d' demo

# 4. 删除以小写字母开头的行
sed '/^[a-z]/d' demo

# 5. 删除所有空行(^$ 匹配空行)
sed '/^$/d' demo

3. 替换文本内容(s 动作,最常用)

核心需求:批量修改文本中的字符或字符串,支持全局替换、指定行替换等。

# 1. 每行第一个“the”替换为“THE”(默认替换第1个匹配项)
sed 's/the/THE/' demo

# 2. 全局替换:所有“the”替换为“THE”(g 表示 global)
sed 's/the/THE/g' demo

# 3. 第3-5行的“the”替换为“THE”
sed '3,5s/the/THE/g' demo

# 4. 在每行行首插入“#”(注释行)
sed 's/^/#/' demo

# 5. 在每行行尾插入“EOF”
sed 's/$/EOF/' demo

# 🌟 实际场景:修改 SELinux 配置(启用 SELinux,备份原文件)
sed -i.bak 's/SELINUX=disabled/SELINUX=enforcing/' /etc/selinux/config

4. 迁移与追加文本(H/G/w/r 动作)

核心需求:移动文本位置、保存特定行到新文件、追加外部文件内容。

# 1. 将包含“the”的行移到文件末尾(H:复制到剪贴板;d:删原行;$G:末尾追加)
sed '/the/{H;d};$G' demo

# 2. 将包含“the”的行保存到 out.file(w:写入文件)
sed '/the/w out.file' demo

# 3. 将 /etc/hostname 的内容追加到包含“the”的行后(r:读取外部文件)
sed '/the/r /etc/hostname' demo

# 4. 第3行后插入多行内容(\n 表示换行)
sed '3aNew1\nNew2\nNew3' demo

5. 分组操作({} 语法)

当需要对同一行执行多个指令时,用 {;} 分组,避免重复指定行地址:

# 对包含“root”的行,先替换“root”为“ROOT”,再替换“x”为“X”
sed '/root/{s/root/ROOT/;s/x/X/g}' /etc/passwd

四、生产环境实战案例

sed 的真正价值体现在批量处理和自动化脚本中,以下是三个典型生产场景。

案例1:批量修改网卡 IP 地址

需求:将 ens33 网卡的 IP 地址改为 192.168.10.100(配置文件路径:/etc/sysconfig/network-scripts/ifcfg-ens33

# 直接修改源文件(无备份,谨慎!需备份可加 -i.bak)
sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network-scripts/ifcfg-ens33

案例2:修改 Apache 服务配置

需求:将 Apache 监听地址改为 192.168.10.100,端口改为 8080(配置文件:/etc/httpd/conf/httpd.conf

# 1. 修改监听地址
sudo sed -i 's/^Listen .*/Listen 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf

# 2. 修改 ServerName(与监听地址一致)
sed -i 's/^ServerName .*/ServerName 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf

案例3:编写 vsftpd 配置自动化脚本

需求:禁止匿名登录,允许本地用户登录并支持写入,同时启动服务并设为开机自启。

# 创建脚本文件 local_only_ftp.sh
vim local_only_ftp.sh
#!/bin/bash
# 定义配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
CONFIG="/etc/vsftpd/vsftpd.conf"

# 备份原配置(仅当备份不存在时执行)
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak

# 1. 禁用匿名登录(基于样本文件)
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG

# 2. 启用本地用户登录和写入权限(多指令用 -e 分隔)
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG

# 3. 若无 listen=YES,在文件末尾添加
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG

# 4. 启动服务并设为开机自启
systemctl restart vsftpd
systemctl enable vsftpd

# 赋予执行权限并运行
chmod +x local_only_ftp.sh
./local_only_ftp.sh

五、sed 学习总结与避坑指南

1. 核心知识点回顾

  • 工作流:逐行处理模式空间,默认不修改源文件;
  • 关键选项-n(精准输出)、-i(直接编辑)、-r(扩展正则);
  • 高频动作p(打印)、d(删除)、s(替换)、a/i(插入);
  • 实战技巧:复杂指令用脚本文件管理,多指令用分组或 -e 串联。

2. 避坑指南

  1. 使用 -i 前必备份:直接编辑源文件风险高,建议加备份后缀(如 -i.bak);
  2. 正则转义问题:未用 -r 时,+?() 等需加 \ 转义(如 \(abc\));
  3. 预览结果再执行:修改前先用 -n 预览效果(如 sed -n 's/the/THE/gp' demo),确认无误再用 -i
  4. 行地址格式:范围行用 n1,n2(如 3,5),匹配行用 /pattern/(如 /the/)。

sed 看似语法复杂,但掌握核心逻辑后,会发现它是“一劳永逸”的文本处理工具——无论是日常运维还是自动化脚本编写,都能大幅提升效率。建议从简单场景(如筛选行、替换字符)开始练习,逐步过渡到复杂脚本,很快就能熟练掌握!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐